/ Hex Artifact Content
Login

Artifact 8526ea4590b158dfa1b62831da9b50337d131f375aaa27c61567b345e9760cd2:


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 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  if.};../*.** A l
a010: 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78  ists of all unix
a020: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
a030: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 75 73 74 20 68 6f  s..**.** Must ho
a040: 6c 64 20 75 6e 69 78 42 69 67 4c 6f 63 6b 20 69  ld unixBigLock i
a050: 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 61 64 20  n order to read 
a060: 6f 72 20 77 72 69 74 65 20 74 68 69 73 20 76 61  or write this va
a070: 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
a080: 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  c unixInodeInfo 
a090: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 20  *inodeList = 0; 
a0a0: 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49 6e 6f 64   /* All unixInod
a0b0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
a0c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a0d0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 72 75 65  DEBUG./*.** True
a0e0: 20 69 66 20 74 68 65 20 69 6e 6f 64 65 20 6d 75   if the inode mu
a0f0: 74 65 78 20 28 6f 6e 20 74 68 65 20 75 6e 69 78  tex (on the unix
a100: 46 69 6c 65 2e 70 46 69 6c 65 4d 75 74 65 78 20  File.pFileMutex 
a110: 66 69 65 6c 64 29 20 69 73 20 68 65 6c 64 2c 20  field) is held, 
a120: 6f 72 20 6e 6f 74 2e 0a 2a 2a 20 54 68 69 73 20  or not..** This 
a130: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
a140: 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
a150: 72 74 28 29 20 74 6f 20 68 65 6c 70 20 76 65 72  rt() to help ver
a160: 69 66 79 20 63 6f 72 72 65 63 74 20 6d 75 74 65  ify correct mute
a170: 78 0a 2a 2a 20 75 73 61 67 65 2e 0a 2a 2f 0a 69  x.** usage..*/.i
a180: 6e 74 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78  nt unixFileMutex
a190: 48 65 6c 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  Held(unixFile *p
a1a0: 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28  File){.  assert(
a1b0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 29   pFile->pInode )
a1c0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
a1d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46  e3_mutex_held(pF
a1e0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f  ile->pInode->pLo
a1f0: 63 6b 4d 75 74 65 78 29 3b 0a 7d 0a 69 6e 74 20  ckMutex);.}.int 
a200: 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74  unixFileMutexNot
a210: 68 65 6c 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  held(unixFile *p
a220: 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28  File){.  assert(
a230: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 29   pFile->pInode )
a240: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
a250: 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
a260: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  (pFile->pInode->
a270: 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 7d 0a 23  pLockMutex);.}.#
a280: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20  endif../*.**.** 
a290: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
a2a0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
a2b0: 6e 65 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76  ne(), is only ev
a2c0: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
a2d0: 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c  e macro.** unixL
a2e0: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
a2f0: 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61   It is invoked a
a300: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
a310: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
a320: 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f  nction and errno
a330: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74   has been.** set
a340: 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  . It logs a mess
a350: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
a360: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
a370: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
a380: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f  alue of.** errno
a390: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
a3a0: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
a3b0: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
a3c0: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
a3d0: 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f   or.** strerror_
a3e0: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  r()..**.** The f
a3f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
a400: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
a410: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
a420: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
a430: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
a440: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
a450: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
a460: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
a470: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
a480: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
a490: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
a4a0: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
a4b0: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
a4c0: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
a4d0: 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c   (e.g. "unlink",
a4e0: 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65   "open") and the
a4f0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
a500: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
a510: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
a520: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
a530: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
a540: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
a550: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
a560: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
a570: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
a580: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5a0: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
a5b0: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
a5c0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
a5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
a5e0: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
a5f0: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
a600: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
a610: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
a620: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
a630: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
a640: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
a650: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
a660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
a670: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
a680: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
a690: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
a6a0: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6c0: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
a6d0: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
a6e0: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
a6f0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
a700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
a710: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
a720: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
a730: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
a740: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
a750: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
a760: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
a770: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
a780: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
a790: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
a7a0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
a7b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
a7c0: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
a7d0: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
a7e0: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
a7f0: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
a800: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
a810: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
a820: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
a830: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
a840: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
a850: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
a860: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
a870: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
a880: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
a890: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
a8a0: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
a8b0: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
a8c0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
a8d0: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
a8e0: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
a8f0: 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  of strerror_r() 
a900: 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  that.  ** return
a910: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
a920: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
a930: 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
a940: 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74  sage. That point
a950: 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69  er .  ** may poi
a960: 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72  nt to aErr[], or
a970: 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   it may point to
a980: 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f   some static sto
a990: 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20  rage somewhere. 
a9a0: 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
a9b0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
a9c0: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
a9d0: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
a9e0: 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65  on of .  ** stre
a9f0: 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20  rror_r(), which 
aa00: 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e  always writes an
aa10: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
aa20: 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a  nto aErr[]..  **
aa30: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64  .  ** If the cod
aa40: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73  e incorrectly as
aa50: 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
aa60: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
aa70: 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  on that is.  ** 
aa80: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65  available, the e
aa90: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
aaa0: 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d  l often be an em
aab0: 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20  pty string. Not 
aac0: 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62  a.  ** huge prob
aad0: 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79  lem. Incorrectly
aae0: 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74   concluding that
aaf0: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
ab00: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20   is available . 
ab10: 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74   ** could lead t
ab20: 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f  o a segfault tho
ab30: 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  ugh..  */.#if de
ab40: 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52  fined(STRERROR_R
ab50: 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69  _CHAR_P) || defi
ab60: 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20  ned(__USE_GNU). 
ab70: 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66   zErr = .# endif
ab80: 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45  .  strerror_r(iE
ab90: 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65  rrno, aErr, size
aba0: 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65  of(aErr)-1);..#e
abb0: 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  lif SQLITE_THREA
abc0: 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20  DSAFE.  /* This 
abd0: 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20  is a threadsafe 
abe0: 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72  build, but strer
abf0: 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61  ror_r() is not a
ac00: 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a  vailable. */.  z
ac10: 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a  Err = "";.#else.
ac20: 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73    /* Non-threads
ac30: 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73  afe build, use s
ac40: 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20  trerror(). */.  
ac50: 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28  zErr = strerror(
ac60: 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a  iErrno);.#endif.
ac70: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
ac80: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
ac90: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
aca0: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75  ode,.      "os_u
acb0: 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  nix.c:%d: (%d) %
acc0: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
acd0: 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f     iLine, iErrno
ace0: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
acf0: 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zErr.  );..  ret
ad00: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
ad10: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
ad20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
ad30: 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74  *.** We assume t
ad40: 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f  hat close() almo
ad50: 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c  st always works,
ad60: 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c   since it is onl
ad70: 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73  y in a.** very s
ad80: 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ick application 
ad90: 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63  or on a very sic
ada0: 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20  k platform that 
adb0: 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a  it might fail..*
adc0: 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69  * If it does fai
add0: 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74  l, simply leak t
ade0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
adf0: 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74  or, but do log t
ae00: 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  he.** error..**.
ae10: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
ae20: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72  is not safe to r
ae30: 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74  etry close() aft
ae40: 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74  er EINTR since t
ae50: 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  he.** file descr
ae60: 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65  iptor might have
ae70: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
ae80: 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20  used by another 
ae90: 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65  thread..** So we
aea0: 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20   don't even try 
aeb0: 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
aec0: 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20  an EINTR.  Just 
aed0: 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  log the error.**
aee0: 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f   and move on..*/
aef0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62  .static void rob
af00: 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69  ust_close(unixFi
af10: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68  le *pFile, int h
af20: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
af30: 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20   if( osClose(h) 
af40: 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  ){.    unixLogEr
af50: 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45  rorAtLine(SQLITE
af60: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63  _IOERR_CLOSE, "c
af70: 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20  lose",.         
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
af90: 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61  ile ? pFile->zPa
afa0: 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b  th : 0, lineno);
afb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
afc0: 74 20 74 68 65 20 70 46 69 6c 65 2d 3e 6c 61 73  t the pFile->las
afd0: 74 45 72 72 6e 6f 2e 20 20 44 6f 20 74 68 69 73  tErrno.  Do this
afe0: 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65   in a subroutine
aff0: 20 61 73 20 74 68 61 74 20 70 72 6f 76 69 64 65   as that provide
b000: 73 0a 2a 2a 20 61 20 63 6f 6e 76 65 6e 69 65 6e  s.** a convenien
b010: 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  t place to set a
b020: 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   breakpoint..*/.
b030: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72  static void stor
b040: 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e 69 78 46  eLastErrno(unixF
b050: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
b060: 65 72 72 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d  error){.  pFile-
b070: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
b080: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  or;.}../*.** Clo
b090: 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63  se all file desc
b0a0: 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74  riptors accumuat
b0b0: 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e  ed in the unixIn
b0c0: 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64  odeInfo->pUnused
b0d0: 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69   list..*/ .stati
b0e0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64  c void closePend
b0f0: 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20  ingFds(unixFile 
b100: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
b110: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
b120: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
b130: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
b140: 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65   *p;.  UnixUnuse
b150: 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73  dFd *pNext;.  as
b160: 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75  sert( unixFileMu
b170: 74 65 78 48 65 6c 64 28 70 46 69 6c 65 29 20 29  texHeld(pFile) )
b180: 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65  ;.  for(p=pInode
b190: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
b1a0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
b1b0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
b1c0: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
b1d0: 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c  File, p->fd, __L
b1e0: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69  INE__);.    sqli
b1f0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
b200: 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
b210: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
b220: 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49   Release a unixI
b230: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
b240: 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  re previously al
b250: 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 49  located by findI
b260: 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a  nodeInfo()..**.*
b270: 2a 20 54 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  * The global mut
b280: 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
b290: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
b2a0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 62 75 74  e is called, but
b2b0: 20 74 68 65 20 6d 75 74 65 78 0a 2a 2a 20 6f 6e   the mutex.** on
b2c0: 20 74 68 65 20 69 6e 6f 64 65 20 62 65 69 6e 67   the inode being
b2d0: 20 64 65 6c 65 74 65 64 20 6d 75 73 74 20 4e 4f   deleted must NO
b2e0: 54 20 62 65 20 68 65 6c 64 2e 0a 2a 2f 0a 73 74  T be held..*/.st
b2f0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
b300: 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46  eInodeInfo(unixF
b310: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
b320: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
b330: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
b340: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
b350: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
b360: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  );.  assert( uni
b370: 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c  xFileMutexNothel
b380: 64 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 69 66  d(pFile) );.  if
b390: 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29  ( ALWAYS(pInode)
b3a0: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   ){.    pInode->
b3b0: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
b3c0: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  pInode->nRef==0 
b3d0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b3e0: 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
b3f0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  e==0 );.      sq
b400: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
b410: 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  r(pInode->pLockM
b420: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 63 6c 6f  utex);.      clo
b430: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
b440: 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
b450: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
b460: 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
b470: 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  x);.      if( pI
b480: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20  node->pPrev ){. 
b490: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b4a0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
b4b0: 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ext==pInode );. 
b4c0: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
b4d0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49  Prev->pNext = pI
b4e0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
b4f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b500: 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c    assert( inodeL
b510: 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ist==pInode );. 
b520: 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74         inodeList
b530: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
b540: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b550: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  if( pInode->pNex
b560: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
b570: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  ert( pInode->pNe
b580: 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64  xt->pPrev==pInod
b590: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
b5a0: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
b5b0: 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  v = pInode->pPre
b5c0: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
b5d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
b5e0: 72 65 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ree(pInode->pLoc
b5f0: 6b 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  kMutex);.      s
b600: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f  qlite3_free(pIno
b610: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  de);.    }.  }.}
b620: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
b630: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
b640: 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78   locate the unix
b650: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
b660: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
b670: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
b680: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
b690: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
b6a0: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
b6b0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69   return value mi
b6c0: 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c  ght be uninitial
b6d0: 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  ized if an error
b6e0: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
b6f0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
b700: 6d 75 73 74 20 68 65 6c 64 20 77 68 65 6e 20 63  must held when c
b710: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
b720: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ine..**.** Retur
b730: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
b740: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
b750: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
b760: 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78  nodeInfo(.  unix
b770: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
b780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
b790: 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c  ix file with fil
b7a0: 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74  e desc used in t
b7b0: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78  he key */.  unix
b7c0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e  InodeInfo **ppIn
b7d0: 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ode        /* Re
b7e0: 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  turn the unixIno
b7f0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65  deInfo object he
b800: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
b810: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73            /* Sys
b830: 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20  tem call return 
b840: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64  code */.  int fd
b850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b860: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b870: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
b880: 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  for pFile */.  s
b890: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
b8a0: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a   fileId;      /*
b8b0: 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20   Lookup key for 
b8c0: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
b8d0: 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  o */.  struct st
b8e0: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
b8f0: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
b900: 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
b910: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ion */.  unixIno
b920: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
b930: 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69   0;     /* Candi
b940: 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  date unixInodeIn
b950: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  fo object */..  
b960: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
b970: 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a  xHeld() );..  /*
b980: 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69   Get low-level i
b990: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
b9a0: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
b9b0: 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20  e can used to.  
b9c0: 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  ** create a uniq
b9d0: 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ue name for the 
b9e0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20  file..  */.  fd 
b9f0: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63  = pFile->h;.  rc
ba00: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
ba10: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
ba20: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f  rc!=0 ){.    sto
ba30: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
ba40: 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64  e, errno);.#if d
ba50: 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57  efined(EOVERFLOW
ba60: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
ba70: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29  ITE_DISABLE_LFS)
ba80: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
ba90: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52  lastErrno==EOVER
baa0: 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51  FLOW ) return SQ
bab0: 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64  LITE_NOLFS;.#end
bac0: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
bad0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
bae0: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
baf0: 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f  _.  /* On OS X o
bb00: 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73  n an msdos files
bb10: 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65  ystem, the inode
bb20: 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72   number is repor
bb30: 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65  ted.  ** incorre
bb40: 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69  ctly for zero-si
bb50: 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74  ze files.  See t
bb60: 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f  icket #3260.  To
bb70: 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e   work.  ** aroun
bb80: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  d this problem (
bb90: 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61  we consider it a
bba0: 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f   bug in OS X, no
bbb0: 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77  t SQLite).  ** w
bbc0: 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73  e always increas
bbd0: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
bbe0: 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20  to 1 by writing 
bbf0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
bc00: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65  ** prior to acce
bc10: 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20  ssing the inode 
bc20: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65  number.  The one
bc30: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73   byte written is
bc40: 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27  .  ** an ASCII '
bc50: 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69  S' character whi
bc60: 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20  ch also happens 
bc70: 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
bc80: 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  byte.  ** in the
bc90: 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79   header of every
bca0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
bcb0: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
bcc0: 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  if there.  ** is
bcd0: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
bce0: 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74  n such that anot
bcf0: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61  her thread has a
bd00: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
bd10: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
bd20: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
bd30: 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20  base, no damage 
bd40: 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  is done..  */.  
bd50: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73  if( statbuf.st_s
bd60: 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65  ize==0 && (pFile
bd70: 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  ->fsFlags & SQLI
bd80: 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
bd90: 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64  DOS)!=0 ){.    d
bda0: 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28  o{ rc = osWrite(
bdb0: 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68  fd, "S", 1); }wh
bdc0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
bdd0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
bde0: 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20   if( rc!=1 ){.  
bdf0: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
be00: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
be10: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
be20: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
be30: 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73   }.    rc = osFs
be40: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
be50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
be60: 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
be70: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
be80: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  errno);.      re
be90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
bea0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
beb0: 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66  dif..  memset(&f
bec0: 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66  ileId, 0, sizeof
bed0: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c  (fileId));.  fil
bee0: 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  eId.dev = statbu
bef0: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
bf00: 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49  _VXWORKS.  fileI
bf10: 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70  d.pId = pFile->p
bf20: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65  Id;.#else.  file
bf30: 49 64 2e 69 6e 6f 20 3d 20 28 75 36 34 29 73 74  Id.ino = (u64)st
bf40: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
bf50: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 75  ndif.  assert( u
bf60: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
bf70: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f  ;.  pInode = ino
bf80: 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
bf90: 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d   pInode && memcm
bfa0: 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f  p(&fileId, &pIno
bfb0: 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  de->fileId, size
bfc0: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
bfd0: 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
bfe0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  de->pNext;.  }. 
bff0: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
c000: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73  {.    pInode = s
c010: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
c020: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
c030: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
c040: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
c050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
c060: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
c070: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
c080: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
c090: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
c0a0: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
c0b0: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
c0c0: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
c0d0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
c0e0: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
c0f0: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  tex ){.      pIn
c100: 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 20  ode->pLockMutex 
c110: 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
c120: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
c130: 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
c140: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  if( pInode->pLoc
c150: 6b 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  kMutex==0 ){.   
c160: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
c170: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20  e(pInode);.     
c180: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c190: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
c1a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
c1b0: 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Inode->nRef = 1;
c1c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69  .    assert( uni
c1d0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
c1e0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
c1f0: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
c200: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
c210: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
c220: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
c230: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
c240: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
c250: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
c260: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
c270: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
c280: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
c290: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
c2a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c2b0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70  Return TRUE if p
c2c0: 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  File has been re
c2d0: 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65  named or unlinke
c2e0: 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66  d since it was f
c2f0: 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  irst opened..*/.
c300: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48  static int fileH
c310: 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65  asMoved(unixFile
c320: 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53   *pFile){.#if OS
c330: 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72  _VXWORKS.  retur
c340: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
c350: 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64  =0 && pFile->pId
c360: 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  !=pFile->pInode-
c370: 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c  >fileId.pId;.#el
c380: 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  se.  struct stat
c390: 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70   buf;.  return p
c3a0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
c3b0: 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74  &&.      (osStat
c3c0: 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
c3d0: 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20 20 20  buf)!=0 .       
c3e0: 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e 73 74    || (u64)buf.st
c3f0: 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  _ino!=pFile->pIn
c400: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29  ode->fileId.ino)
c410: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
c420: 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46  ** Check a unixF
c430: 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61  ile that is a da
c440: 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20  tabase.  Verify 
c450: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
c460: 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69  *.** (1) There i
c470: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61  s exactly one ha
c480: 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66  rd link on the f
c490: 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66  ile.** (2) The f
c4a0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d  ile is not a sym
c4b0: 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33  bolic link.** (3
c4c0: 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e  ) The file has n
c4d0: 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20  ot been renamed 
c4e0: 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a  or unlinked.**.*
c4f0: 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f  * Issue sqlite3_
c500: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
c510: 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73  NG,...) messages
c520: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20   if anything is 
c530: 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74  not right..*/.st
c540: 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79  atic void verify
c550: 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  DbFile(unixFile 
c560: 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63  *pFile){.  struc
c570: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e  t stat buf;.  in
c580: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 73  t rc;..  /* Thes
c590: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
c5a0: 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65 20 6d  occurs for the m
c5b0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 6c  ain database onl
c5c0: 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  y */.  if( pFile
c5d0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
c5e0: 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 20  IXFILE_NOLOCK ) 
c5f0: 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d 20  return;..  rc = 
c600: 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
c610: 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72  , &buf);.  if( r
c620: 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c!=0 ){.    sqli
c630: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
c640: 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20  ARNING, "cannot 
c650: 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73  fstat db file %s
c660: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
c670: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
c680: 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e  }.  if( buf.st_n
c690: 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73  link==0 ){.    s
c6a0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
c6b0: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65  E_WARNING, "file
c6c0: 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20   unlinked while 
c6d0: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
c6e0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
c6f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
c700: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29  buf.st_nlink>1 )
c710: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
c720: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
c730: 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b  , "multiple link
c740: 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20  s to file: %s", 
c750: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
c760: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
c770: 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65   if( fileHasMove
c780: 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  d(pFile) ){.    
c790: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
c7a0: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
c7b0: 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20  e renamed while 
c7c0: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
c7d0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
c7e0: 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  turn;.  }.}.../*
c7f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c800: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
c810: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
c820: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
c830: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
c840: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
c850: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
c860: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
c870: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
c880: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
c890: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
c8a0: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
c8b0: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
c8c0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
c8d0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
c8e0: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
c8f0: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
c900: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
c910: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
c920: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
c930: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
c940: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
c950: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
c960: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c970: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
c980: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
c990: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
c9a0: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
c9b0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
c9c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
c9d0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
c9e0: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
c9f0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
ca00: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
ca10: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
ca20: 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  LOCK );.  sqlite
ca30: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 46  3_mutex_enter(pF
ca40: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f  ile->pInode->pLo
ca50: 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ckMutex);..  /* 
ca60: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
ca70: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
ca80: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
ca90: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
caa0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
cab0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
cac0: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
cad0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
cae0: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
caf0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
cb00: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
cb10: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
cb20: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
cb30: 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d  erved && !pFile-
cb40: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
cb50: 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72  sLock ){.    str
cb60: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
cb70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
cb80: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
cb90: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
cba0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
cbb0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
cbc0: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
cbd0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
cbe0: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
cbf0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
cc00: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
cc10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
cc20: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
cc30: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f  DLOCK;.      sto
cc40: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
cc50: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  e, errno);.    }
cc60: 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c   else if( lock.l
cc70: 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29  _type!=F_UNLCK )
cc80: 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  {.      reserved
cc90: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
cca0: 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c 69  #endif.  .  sqli
ccb0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ccc0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
ccd0: 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53  LockMutex);.  OS
cce0: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
ccf0: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75  LOCK %d %d %d (u
cd00: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
cd10: 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
cd20: 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
cd30: 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
cd40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cd50: 20 53 65 74 20 61 20 70 6f 73 69 78 2d 61 64 76   Set a posix-adv
cd60: 69 73 6f 72 79 2d 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  isory-lock..**.*
cd70: 2a 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  * There are two 
cd80: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
cd90: 20 72 6f 75 74 69 6e 65 2e 20 20 49 66 20 63 6f   routine.  If co
cda0: 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a 20 53  mpiled with.** S
cdb0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54  QLITE_ENABLE_SET
cdc0: 4c 4b 5f 54 49 4d 45 4f 55 54 20 74 68 65 6e 20  LK_TIMEOUT then 
cdd0: 74 68 65 20 72 6f 75 74 69 6e 65 20 68 61 73 20  the routine has 
cde0: 61 6e 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  an extra paramet
cdf0: 65 72 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  er.** which is a
ce00: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 75 6e   pointer to a un
ce10: 69 78 46 69 6c 65 2e 20 20 49 66 20 74 68 65 20  ixFile.  If the 
ce20: 75 6e 69 78 46 69 6c 65 2d 3e 69 42 75 73 79 54  unixFile->iBusyT
ce30: 69 6d 65 6f 75 74 0a 2a 2a 20 76 61 6c 75 65 20  imeout.** value 
ce40: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20  is set, then it 
ce50: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
ce60: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 74 6f   milliseconds to
ce70: 20 77 61 69 74 20 62 65 66 6f 72 65 0a 2a 2a 20   wait before.** 
ce80: 66 61 69 6c 69 6e 67 20 74 68 65 20 6c 6f 63 6b  failing the lock
ce90: 2e 20 20 54 68 65 20 69 42 75 73 79 54 69 6d 65  .  The iBusyTime
cea0: 6f 75 74 20 76 61 6c 75 65 20 69 73 20 61 6c 77  out value is alw
ceb0: 61 79 73 20 72 65 73 65 74 20 62 61 63 6b 20 74  ays reset back t
cec0: 6f 0a 2a 2a 20 7a 65 72 6f 20 6f 6e 20 65 61 63  o.** zero on eac
ced0: 68 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  h call..**.** If
cee0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
cef0: 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 69 73 20  ETLK_TIMEOUT is 
cf00: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68 65  not defined, the
cf10: 6e 20 64 6f 20 61 20 6e 6f 6e 2d 62 6c 6f 63 6b  n do a non-block
cf20: 69 6e 67 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74  ing.** attempt t
cf30: 6f 20 73 65 74 20 74 68 65 20 6c 6f 63 6b 2e 0a  o set the lock..
cf40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
cf50: 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54  E_ENABLE_SETLK_T
cf60: 49 4d 45 4f 55 54 0a 23 20 64 65 66 69 6e 65 20  IMEOUT.# define 
cf70: 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f  osSetPosixAdviso
cf80: 72 79 4c 6f 63 6b 28 68 2c 78 2c 74 29 20 6f 73  ryLock(h,x,t) os
cf90: 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c  Fcntl(h,F_SETLK,
cfa0: 78 29 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  x).#else.static 
cfb0: 69 6e 74 20 6f 73 53 65 74 50 6f 73 69 78 41 64  int osSetPosixAd
cfc0: 76 69 73 6f 72 79 4c 6f 63 6b 28 0a 20 20 69 6e  visoryLock(.  in
cfd0: 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
cfe0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
cff0: 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 77 68  descriptor on wh
d000: 69 63 68 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ich to take the 
d010: 6c 6f 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74  lock */.  struct
d020: 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20 20   flock *pLock,  
d030: 2f 2a 20 54 68 65 20 64 65 73 63 72 69 70 74 69  /* The descripti
d040: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a  on of the lock *
d050: 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
d060: 69 6c 65 20 20 20 20 20 20 20 2f 2a 20 53 74 72  ile       /* Str
d070: 75 63 74 75 72 65 20 68 6f 6c 64 69 6e 67 20 74  ucture holding t
d080: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2a 2f 0a  imeout value */.
d090: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 6f 73  ){.  int rc = os
d0a0: 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c  Fcntl(h,F_SETLK,
d0b0: 70 4c 6f 63 6b 29 3b 0a 20 20 77 68 69 6c 65 28  pLock);.  while(
d0c0: 20 72 63 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e   rc<0 && pFile->
d0d0: 69 42 75 73 79 54 69 6d 65 6f 75 74 3e 30 20 29  iBusyTimeout>0 )
d0e0: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 20 73 79 73 74  {.    /* On syst
d0f0: 65 6d 73 20 74 68 61 74 20 73 75 70 70 6f 72 74  ems that support
d100: 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 62 6c   some kind of bl
d110: 6f 63 6b 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  ocking file lock
d120: 20 77 69 74 68 20 61 20 74 69 6d 65 6f 75 74 2c   with a timeout,
d130: 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 61 70 70  .    ** make app
d140: 72 6f 70 72 69 61 74 65 20 63 68 61 6e 67 65 73  ropriate changes
d150: 20 68 65 72 65 20 74 6f 20 69 6e 76 6f 6b 65 20   here to invoke 
d160: 74 68 61 74 20 62 6c 6f 63 6b 69 6e 67 20 66 69  that blocking fi
d170: 6c 65 20 6c 6f 63 6b 2e 20 20 4f 6e 0a 20 20 20  le lock.  On.   
d180: 20 2a 2a 20 67 65 6e 65 72 69 63 20 70 6f 73 69   ** generic posi
d190: 78 2c 20 68 6f 77 65 76 65 72 2c 20 74 68 65 72  x, however, ther
d1a0: 65 20 69 73 20 6e 6f 20 73 75 63 68 20 41 50 49  e is no such API
d1b0: 2e 20 20 53 6f 20 77 65 20 73 69 6d 70 6c 79 20  .  So we simply 
d1c0: 74 72 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  try the.    ** l
d1d0: 6f 63 6b 20 6f 6e 63 65 20 65 76 65 72 79 20 6d  ock once every m
d1e0: 69 6c 6c 69 73 65 63 6f 6e 64 20 75 6e 74 69 6c  illisecond until
d1f0: 20 65 69 74 68 65 72 20 74 68 65 20 74 69 6d 65   either the time
d200: 6f 75 74 20 65 78 70 69 72 65 73 2c 20 6f 72 20  out expires, or 
d210: 75 6e 74 69 6c 0a 20 20 20 20 2a 2a 20 74 68 65  until.    ** the
d220: 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
d230: 64 2e 20 2a 2f 0a 20 20 20 20 75 73 6c 65 65 70  d. */.    usleep
d240: 28 31 30 30 30 29 3b 0a 20 20 20 20 72 63 20 3d  (1000);.    rc =
d250: 20 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54   osFcntl(h,F_SET
d260: 4c 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 70  LK,pLock);.    p
d270: 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65 6f  File->iBusyTimeo
d280: 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ut--;.  }.  retu
d290: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
d2a0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
d2b0: 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 2a  _SETLK_TIMEOUT *
d2c0: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  /.../*.** Attemp
d2d0: 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65  t to set a syste
d2e0: 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  m-lock on the fi
d2f0: 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c  le pFile.  The l
d300: 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72  ock is .** descr
d310: 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a  ibed by pLock..*
d320: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c  *.** If the pFil
d330: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
d340: 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69  d/write from uni
d350: 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65  x-excl, then the
d360: 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76   only lock.** ev
d370: 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61  er obtained is a
d380: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
d390: 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61  , and it is obta
d3a0: 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  ined exactly onc
d3b0: 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  e.** the first t
d3c0: 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20  ime any lock is 
d3d0: 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20  attempted.  All 
d3e0: 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65  subsequent syste
d3f0: 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65  m locking.** ope
d400: 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e  rations become n
d410: 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20  o-ops.  Locking 
d420: 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c  operations still
d430: 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c   happen internal
d440: 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ly,.** in order 
d450: 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63  to coordinate ac
d460: 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70  cess between sep
d470: 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63  arate database c
d480: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69  onnections.** wi
d490: 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  thin this proces
d4a0: 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68  s, but all of th
d4b0: 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  at is handled in
d4c0: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a   memory and the.
d4d0: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
d4e0: 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72  tem does not par
d4f0: 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ticipate..**.** 
d500: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d510: 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20   a pass-through 
d520: 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b  to fcntl(F_SETLK
d530: 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73  ) if pFile is us
d540: 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f  ing.** any VFS o
d550: 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d  ther than "unix-
d560: 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c  excl" or if pFil
d570: 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22  e is opened on "
d580: 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e  unix-excl".** an
d590: 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  d is read-only..
d5a0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
d5b0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61  turned if the ca
d5c0: 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63  ll completes suc
d5d0: 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31  cessfully, or -1
d5e0: 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f   if a call.** to
d5f0: 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20   fcntl() fails. 
d600: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72  In this case, er
d610: 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f  rno is set appro
d620: 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e  priately (by fcn
d630: 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tl())..*/.static
d640: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63   int unixFileLoc
d650: 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
d660: 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  e, struct flock 
d670: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
d680: 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  c;.  unixInodeIn
d690: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
d6a0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
d6b0: 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20  sert( pInode!=0 
d6c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d6d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d6e0: 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
d6f0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 28 70 46  ex) );.  if( (pF
d700: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
d710: 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 7c   (UNIXFILE_EXCL|
d720: 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29  UNIXFILE_RDONLY)
d730: 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  )==UNIXFILE_EXCL
d740: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   ){.    if( pIno
d750: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
d760: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
d770: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
d780: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d790: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
d7a0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
d7b0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
d7c0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
d7d0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d7e0: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
d7f0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
d800: 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  IZE;.      lock.
d810: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
d820: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 53  ;.      rc = osS
d830: 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79 4c  etPosixAdvisoryL
d840: 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 26 6c  ock(pFile->h, &l
d850: 6f 63 6b 2c 20 70 46 69 6c 65 29 3b 0a 20 20 20  ock, pFile);.   
d860: 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72 65     if( rc<0 ) re
d870: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
d880: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
d890: 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ock = 1;.      p
d8a0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
d8b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d8c0: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   rc = 0;.    }. 
d8d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
d8e0: 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73   osSetPosixAdvis
d8f0: 6f 72 79 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  oryLock(pFile->h
d900: 2c 20 70 4c 6f 63 6b 2c 20 70 46 69 6c 65 29 3b  , pLock, pFile);
d910: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
d930: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
d940: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
d950: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
d960: 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
d970: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
d980: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
d990: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
d9a0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
d9b0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
d9c0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
d9d0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
d9e0: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
d9f0: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
da00: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
da10: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
da20: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
da30: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
da40: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
da50: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
da60: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
da70: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
da80: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
da90: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
daa0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
dab0: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
dac0: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
dad0: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
dae0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
daf0: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
db00: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
db10: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
db20: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
db30: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
db40: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
db50: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
db60: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
db70: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
db80: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
db90: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
dba0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
dbb0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
dbc0: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
dbd0: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
dbe0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
dbf0: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
dc00: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
dc10: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
dc20: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
dc30: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
dc40: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
dc50: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c  int unixLock(sql
dc60: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
dc70: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
dc80: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
dc90: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
dca0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
dcb0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
dcc0: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
dcd0: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
dce0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
dcf0: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
dd00: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
dd10: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
dd20: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
dd30: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
dd40: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
dd50: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
dd60: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
dd70: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
dd80: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
dd90: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
dda0: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
ddb0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
ddc0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 57 69  mpatible with Wi
ddd0: 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73 20  ndows95 systems 
dde0: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20  simultaneously. 
ddf0: 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68   ** accessing th
de00: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
de10: 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68  file, in case th
de20: 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69  at is ever requi
de30: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  red..  **.  ** S
de40: 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69  ymbols defined i
de50: 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79  n os.h indentify
de60: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
de70: 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73  te' and the 'res
de80: 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27  erved.  ** byte'
de90: 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79  , each single by
dea0: 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77  tes at well know
deb0: 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74  n offsets, and t
dec0: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
ded0: 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72    ** range', a r
dee0: 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65  ange of 510 byte
def0: 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77  s at a well know
df00: 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20  n offset..  **. 
df10: 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20   ** To obtain a 
df20: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72  SHARED lock, a r
df30: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  ead-lock is obta
df40: 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e  ined on the 'pen
df50: 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e  ding.  ** byte'.
df60: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63    If this is suc
df70: 63 65 73 73 66 75 6c 2c 20 27 73 68 61 72 65 64  cessful, 'shared
df80: 20 62 79 74 65 20 72 61 6e 67 65 27 20 69 73 20   byte range' is 
df90: 72 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a 2a  read-locked.  **
dfa0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
dfb0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
dfc0: 74 65 27 20 72 65 6c 65 61 73 65 64 2e 20 20 28  te' released.  (
dfd0: 4c 65 67 61 63 79 20 6e 6f 74 65 3a 20 20 57 68  Legacy note:  Wh
dfe0: 65 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 77  en.  ** SQLite w
dff0: 61 73 20 66 69 72 73 74 20 64 65 76 65 6c 6f 70  as first develop
e000: 65 64 2c 20 57 69 6e 64 6f 77 73 39 35 20 73 79  ed, Windows95 sy
e010: 73 74 65 6d 73 20 77 65 72 65 20 73 74 69 6c 6c  stems were still
e020: 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20 20   very common,.  
e030: 2a 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73 39 35  ** and Widnows95
e040: 20 6c 61 63 6b 73 20 61 20 73 68 61 72 65 64 2d   lacks a shared-
e050: 6c 6f 63 6b 20 63 61 70 61 62 69 6c 69 74 79 2e  lock capability.
e060: 20 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77 73 39    So on Windows9
e070: 35 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65  5, a.  ** single
e080: 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
e090: 65 64 20 62 79 20 66 72 6f 6d 20 74 68 65 20 27  ed by from the '
e0a0: 73 68 61 72 65 64 20 62 79 74 65 20 72 61 6e 67  shared byte rang
e0b0: 65 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20  e' is locked..  
e0c0: 2a 2a 20 57 69 6e 64 6f 77 73 39 35 20 69 73 20  ** Windows95 is 
e0d0: 6e 6f 77 20 70 72 65 74 74 79 20 6d 75 63 68 20  now pretty much 
e0e0: 65 78 74 69 6e 63 74 2c 20 62 75 74 20 74 68 69  extinct, but thi
e0f0: 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 66 6f  s work-around fo
e100: 72 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63 6b 20  r the.  ** lack 
e110: 6f 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b 73 20  of shared-locks 
e120: 6f 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c 69 76  on Windows95 liv
e130: 65 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63 6b 77  es on, for backw
e140: 61 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74  ards.  ** compat
e150: 69 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a 20  ibility.).  **. 
e160: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
e170: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
e180: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66  RESERVED lock af
e190: 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41  ter it has a SHA
e1a0: 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41  RED lock..  ** A
e1b0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
e1c0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
e1d0: 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74   grabbing a writ
e1e0: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e-lock on the.  
e1f0: 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74  ** 'reserved byt
e200: 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  e'. .  **.  ** A
e210: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
e220: 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49  y obtain a PENDI
e230: 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  NG lock after it
e240: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a   has obtained a.
e250: 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b    ** SHARED lock
e260: 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  . A PENDING lock
e270: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
e280: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
e290: 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  rite-lock.  ** o
e2a0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
e2b0: 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72  yte'. This ensur
e2c0: 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53  es that no new S
e2d0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20  HARED locks can 
e2e0: 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  be.  ** obtained
e2f0: 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53  , but existing S
e300: 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20  HARED locks are 
e310: 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69  allowed to persi
e320: 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20  st. A process.  
e330: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ** does not have
e340: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53   to obtain a RES
e350: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
e360: 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49  e way to a PENDI
e370: 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68  NG lock..  ** Th
e380: 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  is property is u
e390: 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72  sed by the algor
e3a0: 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67  ithm for rolling
e3b0: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
e3c0: 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  file.  ** after 
e3d0: 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20  a crash..  **.  
e3e0: 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20  ** An EXCLUSIVE 
e3f0: 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61  lock, obtained a
e400: 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c  fter a PENDING l
e410: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a  ock is held, is.
e420: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64    ** implemented
e430: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
e440: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
e450: 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64  e entire 'shared
e460: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
e470: 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68  '. Since all oth
e480: 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65  er locks require
e490: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
e4a0: 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73  one of the bytes
e4b0: 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  .  ** within thi
e4c0: 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e  s range, this en
e4d0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74  sures that no ot
e4e0: 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  her locks are he
e4f0: 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ld on the.  ** d
e500: 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f 0a 20  atabase. .  */. 
e510: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e520: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
e530: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
e540: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
e550: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
e560: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
e570: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72  lock;.  int tErr
e580: 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
e590: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
e5a0: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
e5b0: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
e5c0: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
e5d0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
e5e0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
e5f0: 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
e600: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
e610: 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
e620: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
e630: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
e640: 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49  Lock), pFile->pI
e650: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
e660: 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29       osGetpid(0)
e670: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
e680: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
e690: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
e6a0: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
e6b0: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
e6c0: 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
e6d0: 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
e6e0: 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
e6f0: 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
e700: 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
e710: 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
e720: 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
e730: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
e740: 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
e750: 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
e760: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
e770: 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
e780: 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  ld) (unix)\n", p
e790: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
e7a0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
e7b0: 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20  eFileLock)));.  
e7c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e7d0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
e7e0: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
e7f0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
e800: 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28  correct..  **  (
e810: 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
e820: 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
e830: 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
e840: 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
e850: 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
e860: 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
e870: 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
e880: 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
e890: 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
e8a0: 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
e8b0: 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
e8c0: 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
e8d0: 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
e8e0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
e8f0: 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
e900: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
e910: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
e920: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
e930: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
e940: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
e950: 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
e960: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
e970: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
e980: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
e990: 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
e9a0: 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
e9b0: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
e9c0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
e9d0: 64 73 0a 20 20 2a 2f 0a 20 20 70 49 6e 6f 64 65  ds.  */.  pInode
e9e0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
e9f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ea00: 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e  x_enter(pInode->
ea10: 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20  pLockMutex);..  
ea20: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
ea30: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
ea40: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
ea50: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
ea60: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
ea70: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
ea80: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
ea90: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
eaa0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
eab0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
eac0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
ead0: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
eae0: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
eaf0: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
eb00: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
eb10: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
eb20: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
eb30: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
eb40: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
eb50: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
eb60: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
eb70: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
eb80: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
eb90: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
eba0: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
ebb0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
ebc0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
ebd0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
ebe0: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
ebf0: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
ec00: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
ec10: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
ec20: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
ec30: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
ec40: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
ec50: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
ec60: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
ec70: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
ec80: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
ec90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
eca0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
ecb0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
ecc0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
ecd0: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
ece0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
ecf0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
ed00: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
ed10: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
ed20: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
ed30: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
ed40: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
ed50: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
ed60: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
ed70: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
ed80: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
ed90: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
eda0: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
edb0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
edc0: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
edd0: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
ede0: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
edf0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
ee00: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
ee10: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
ee20: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
ee30: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
ee40: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
ee50: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
ee60: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
ee70: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
ee80: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
ee90: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
eea0: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
eeb0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
eec0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
eed0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
eee0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
eef0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
ef00: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
ef10: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
ef20: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
ef30: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
ef40: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
ef50: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
ef60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
ef70: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
ef80: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
ef90: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
efa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
efb0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
efc0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
efd0: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
efe0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
eff0: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
f000: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
f010: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
f020: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
f030: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
f040: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
f050: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
f060: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f070: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
f080: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
f090: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
f0a0: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
f0b0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
f0c0: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  _OK );..    /* N
f0d0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
f0e0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
f0f0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
f100: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
f110: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
f120: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75  _SIZE;.    if( u
f130: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f140: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
f150: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
f160: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
f170: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
f180: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
f190: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
f1a0: 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  K);.    }..    /
f1b0: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
f1c0: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
f1d0: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
f1e0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
f1f0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
f200: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
f210: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
f220: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e  NLCK;.    if( un
f230: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f240: 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d  , &lock) && rc==
f250: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f260: 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64     /* This could
f270: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e   happen with a n
f280: 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a  etwork mount */.
f290: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
f2a0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
f2b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
f2c0: 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20  LOCK; .    }..  
f2d0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f2e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f2f0: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
f300: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
f310: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
f320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
f330: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
f340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
f350: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
f360: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
f370: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
f380: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
f390: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
f3a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
f3b0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
f3c0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
f3d0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
f3e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
f3f0: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
f400: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
f410: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
f420: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
f430: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
f440: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
f450: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
f460: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
f470: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
f480: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
f490: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
f4a0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
f4b0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
f4c0: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
f4d0: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
f4e0: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
f4f0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
f500: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
f510: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
f520: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
f530: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
f540: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
f550: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
f560: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
f570: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
f580: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
f590: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
f5a0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
f5b0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
f5c0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
f5d0: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
f5e0: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
f5f0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
f600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
f610: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f620: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
f630: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
f640: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
f650: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
f660: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f670: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
f680: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f690: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
f6a0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
f6b0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
f6c0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
f6d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f6e0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
f6f0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f700: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
f710: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f720: 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53    }.  ..#ifdef S
f730: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
f740: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
f750: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
f760: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
f770: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
f780: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
f790: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
f7a0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
f7b0: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
f7c0: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
f7d0: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
f7e0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
f7f0: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
f800: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
f810: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
f820: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
f830: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f840: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
f850: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ->eFileLock<=SHA
f860: 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65  RED_LOCK.   && e
f870: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
f880: 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
f890: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
f8a0: 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
f8b0: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
f8c0: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
f8d0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
f8e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
f8f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f900: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
f910: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
f920: 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
f930: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
f940: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
f950: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
f960: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
f970: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
f980: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
f990: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
f9a0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
f9b0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
f9c0: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
f9d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f9e0: 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ave(pInode->pLoc
f9f0: 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  kMutex);.  OSTRA
fa00: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
fa10: 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c  %s %s (unix)\n",
fa20: 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
fa30: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
fa40: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
fa50: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
fa60: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
fa70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
fa80: 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64  * Add the file d
fa90: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62  escriptor used b
faa0: 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46  y file handle pF
fab0: 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ile to the corre
fac0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75  sponding.** pUnu
fad0: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  sed list..*/.sta
fae0: 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64  tic void setPend
faf0: 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a  ingFd(unixFile *
fb00: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
fb10: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
fb20: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
fb30: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
fb40: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50 72 65  *p = pFile->pPre
fb50: 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 3b  allocatedUnused;
fb60: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 46  .  assert( unixF
fb70: 69 6c 65 4d 75 74 65 78 48 65 6c 64 28 70 46 69  ileMutexHeld(pFi
fb80: 6c 65 29 20 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  le) );.  p->pNex
fb90: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  t = pInode->pUnu
fba0: 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  sed;.  pInode->p
fbb0: 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46  Unused = p;.  pF
fbc0: 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70  ile->h = -1;.  p
fbd0: 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  File->pPrealloca
fbe0: 74 65 64 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  tedUnused = 0;.}
fbf0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
fc00: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
fc10: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
fc20: 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
fc30: 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
fc40: 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
fc50: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
fc60: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
fc70: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
fc80: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
fc90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
fca0: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
fcb0: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
fcc0: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
fcd0: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
fce0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
fcf0: 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46   .** If handleNF
fd00: 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c  SUnlock is true,
fd10: 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61   then on downgra
fd20: 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
fd30: 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44  E_LOCK to SHARED
fd40: 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e  .** the byte ran
fd50: 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e  ge is divided in
fd60: 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74  to 2 parts and t
fd70: 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73  he first part is
fd80: 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a   unlocked then.*
fd90: 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20  * set to a read 
fda0: 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f  lock, then the o
fdb0: 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d  ther part is sim
fdc0: 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54  ply unlocked.  T
fdd0: 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72  his works .** ar
fde0: 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53  ound a bug in BS
fdf0: 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73  D NFS lockd (als
fe00: 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58  o seen on MacOSX
fe10: 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69   10.3+) that fai
fe20: 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65  ls to .** remove
fe30: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
fe40: 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e  on a region when
fe50: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
fe60: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
fe70: 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73  nt posixUnlock(s
fe80: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
fe90: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20   int eFileLock, 
fea0: 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  int handleNFSUnl
feb0: 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ock){.  unixFile
fec0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
fed0: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
fee0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
fef0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
ff00: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
ff10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
ff20: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ff30: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
ff40: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
ff50: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
ff60: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
ff70: 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
ff80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
ff90: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
ffa0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
ffb0: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
ffc0: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
ffd0: 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
ffe0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
fff0: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
10000 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
10010 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
10020 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
10030 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10040 20 7d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46   }.  pInode = pF
10050 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73  ile->pInode;.  s
10060 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10070 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  er(pInode->pLock
10080 4d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  Mutex);.  assert
10090 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
100a0 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
100b0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
100c0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
100d0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
100e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69  ->eFileLock==pFi
100f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
10100 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10110 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
10120 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
10130 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
10140 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
10150 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
10160 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
10170 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
10180 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
10190 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
101a0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
101b0 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
101c0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
101d0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
101e0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
101f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
10200 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
10210 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
10220 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
10230 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
10240 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
10250 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
10260 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
10270 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
10280 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
10290 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
102a0 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
102b0 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
102c0 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
102d0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
102e0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46  n..    */.    pF
102f0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
10300 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
10310 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69      /* downgradi
10320 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ng to a shared l
10330 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c  ock on NFS invol
10340 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65  ves clearing the
10350 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20   write lock.    
10360 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c  ** before establ
10370 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c  ishing the readl
10380 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  ock - to avoid a
10390 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
103a0 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20  we downgrade.   
103b0 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20   ** the lock in 
103c0 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61  2 blocks, so tha
103d0 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61  t part of the ra
103e0 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65  nge will be cove
103f0 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a  red by a .    **
10400 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69   write lock unti
10410 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f  l the rest is co
10420 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20  vered by a read 
10430 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a  lock:.    **  1:
10440 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a     [WWWWW].    *
10450 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a  *  2:   [....W].
10460 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52      **  3:   [RR
10470 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20  RRW].    **  4: 
10480 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f    [RRRR.].    */
10490 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  .    if( eFileLo
104a0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
104b0 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
104c0 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53  __APPLE__) || !S
104d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
104e0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
104f0 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53   (void)handleNFS
10500 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  Unlock;.      as
10510 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55  sert( handleNFSU
10520 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64  nlock==0 );.#end
10530 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
10540 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
10550 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
10560 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
10570 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
10580 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ck ){.        in
10590 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
105a0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
105b0 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
105c0 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
105d0 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
105e0 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
105f0 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
10600 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
10610 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
10620 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
10630 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
10640 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
10650 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
10660 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
10670 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
10680 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
10690 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
106a0 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
106b0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
106c0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
106d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
106e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
106f0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  OCK;.          s
10700 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
10710 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
10720 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
10730 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
10740 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
10750 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
10760 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
10770 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
10780 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
10790 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
107a0 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
107b0 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
107c0 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
107d0 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
107e0 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
107f0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
10800 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10810 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10820 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10830 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10840 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
10850 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
10860 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
10870 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
10880 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
10890 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
108a0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
108b0 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
108c0 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
108d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
108e0 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
108f0 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
10900 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
10910 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
10920 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
10930 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53  HARED_FIRST+divS
10940 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  ize;.        loc
10950 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
10960 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20  _SIZE-divSize;. 
10970 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
10980 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
10990 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
109a0 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
109b0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
109c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
109d0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
109e0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
109f0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
10a00 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
10a10 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
10a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10a30 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
10a40 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
10a50 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
10a60 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
10a70 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20  LE */.      {.  
10a80 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
10a90 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
10aa0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
10ab0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
10ac0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
10ad0 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
10ae0 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
10af0 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
10b00 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66  SIZE;.        if
10b10 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
10b20 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
10b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
10b40 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c  theory, the call
10b50 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b   to unixFileLock
10b60 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62  () cannot fail b
10b70 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20  ecause another. 
10b80 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
10b90 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ess is holding a
10ba0 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c  n incompatible l
10bb0 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  ock. If it does,
10bc0 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
10bd0 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68   ** indicates th
10be0 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f  at the other pro
10bf0 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
10c00 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e  owing the lockin
10c10 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  g.          ** p
10c20 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73  rotocol. If this
10c30 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e   happens, return
10c40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
10c50 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a  LOCK. Returning.
10c60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
10c70 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63  ITE_BUSY would c
10c80 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72  onfuse the upper
10c90 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74   layer (in pract
10ca0 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20  ice it causes . 
10cb0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61           ** an a
10cc0 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20  ssert to fail). 
10cd0 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63  */ .          rc
10ce0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
10cf0 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  RDLOCK;.        
10d00 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
10d10 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
10d20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
10d30 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
10d40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10d50 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
10d60 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
10d70 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
10d80 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
10d90 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
10da0 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
10db0 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
10dc0 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
10dd0 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
10de0 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
10df0 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
10e00 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
10e10 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  0 ){.      pInod
10e20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
10e30 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
10e40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
10e50 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
10e60 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f  NLOCK;.      sto
10e70 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
10e80 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
10e90 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
10ea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10eb0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
10ec0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44  LOCK ){.    /* D
10ed0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
10ee0 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
10ef0 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
10f00 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
10f10 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
10f20 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
10f30 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
10f40 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
10f50 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
10f60 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
10f70 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
10f80 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
10f90 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
10fa0 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
10fb0 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
10fc0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
10fd0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
10fe0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
10ff0 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
11000 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75   0L;.      if( u
11010 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
11020 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
11030 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
11040 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
11050 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OCK;.      }else
11060 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
11070 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
11080 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  CK;.        stor
11090 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
110a0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
110b0 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
110c0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
110d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
110e0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
110f0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
11100 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
11110 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
11120 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
11130 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
11140 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
11150 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
11160 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
11170 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
11180 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
11190 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
111a0 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
111b0 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
111c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
111d0 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
111e0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
111f0 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
11200 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
11210 6f 63 6b 3d 3d 30 20 29 20 63 6c 6f 73 65 50 65  ock==0 ) closePe
11220 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
11230 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b  .  }..end_unlock
11240 3a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  :.  sqlite3_mute
11250 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e  x_leave(pInode->
11260 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 69  pLockMutex);.  i
11270 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11280 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
11290 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
112a0 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Lock;.  }.  retu
112b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
112c0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
112d0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
112e0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
112f0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
11300 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
11310 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
11320 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
11330 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
11340 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
11350 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
11360 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
11370 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
11380 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
11390 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
113a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
113b0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
113c0 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
113d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
113e0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
113f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
11400 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73  MMAP_SIZE>0.  as
11410 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
11420 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
11430 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29  ((unixFile *)id)
11440 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
11450 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
11460 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
11470 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b  , eFileLock, 0);
11480 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
11490 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
114a0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
114b0 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
114c0 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFd, i64 nByte);
114d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
114e0 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
114f0 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69  ile *pFd);.#endi
11500 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
11510 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
11520 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
11530 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
11540 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
11550 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
11560 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
11570 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
11580 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
11590 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
115a0 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
115b0 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
115c0 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
115d0 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
115e0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
115f0 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
11600 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
11610 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
11620 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
11630 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
11640 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
11650 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
11660 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
11670 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
11680 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
11690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
116a0 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
116b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
116c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
116d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
116e0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
116f0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
11700 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
11710 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  le);.#endif.  if
11720 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
11730 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
11740 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
11750 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
11760 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
11770 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
11780 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
11790 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
117a0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
117b0 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
117c0 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  TE ){.      osUn
117d0 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d  link(pFile->pId-
117e0 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
117f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f  ;.    }.    vxwo
11800 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
11810 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20  (pFile->pId);.  
11820 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
11830 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
11840 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e  def SQLITE_UNLIN
11850 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20  K_AFTER_CLOSE.  
11860 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
11870 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
11880 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73  DELETE ){.    os
11890 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50  Unlink(pFile->zP
118a0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
118b0 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29  3_free(*(char**)
118c0 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a  &pFile->zPath);.
118d0 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68      pFile->zPath
118e0 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
118f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
11900 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
11910 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
11920 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
11930 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
11940 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  e->pPreallocated
11950 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65  Unused);.  memse
11960 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
11970 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
11980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11990 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
119a0 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
119b0 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73  tic int unixClos
119c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
119d0 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  id){.  int rc = 
119e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
119f0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11a00 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
11a10 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
11a20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
11a30 70 49 6e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  pInode;..  asser
11a40 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
11a50 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
11a60 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c  File);.  unixUnl
11a70 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
11a80 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
11a90 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64  FileMutexNotheld
11aa0 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 75 6e 69  (pFile) );.  uni
11ab0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
11ac0 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49    /* unixFile.pI
11ad0 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76  node is always v
11ae0 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72  alid here. Other
11af0 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e  wise, a differen
11b00 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75  t close.  ** rou
11b10 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63  tine (e.g. noloc
11b20 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20  kClose()) would 
11b30 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
11b40 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
11b50 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
11b60 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c  >nLock>0 || pFil
11b70 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
11b80 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  essLock==0 );.  
11b90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
11ba0 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ter(pInode->pLoc
11bb0 6b 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70  kMutex);.  if( p
11bc0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
11bd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
11be0 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
11bf0 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
11c00 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
11c10 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a   file just.    *
11c20 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
11c30 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
11c40 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
11c50 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
11c60 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69  le.    ** descri
11c70 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
11c80 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49  pUnused list.  I
11c90 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
11ca0 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a  tically closed .
11cb0 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
11cc0 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
11cd0 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
11ce0 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
11cf0 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ile);.  }.  sqli
11d00 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11d10 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
11d20 65 78 29 3b 0a 20 20 72 65 6c 65 61 73 65 49 6e  ex);.  releaseIn
11d30 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
11d40 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
11d50 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78  File(id);.  unix
11d60 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
11d70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
11d90 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
11da0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
11db0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
11dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
11e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
11e90 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
11ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11ec0 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
11ed0 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
11ee0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
11ef0 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
11f00 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
11f10 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
11f20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
11f30 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
11f40 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
11f50 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
11f60 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
11f70 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
11f80 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
11f90 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
11fa0 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
11fb0 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
11fc0 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
11fd0 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
11fe0 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
11ff0 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
12000 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
12010 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
12020 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
12030 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
12040 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
12050 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
12060 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
12070 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
12080 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
12090 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
120a0 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
120b0 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
120c0 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
120d0 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
120e0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
120f0 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
12100 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
12110 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
12120 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
12130 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
12140 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12150 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
12160 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
12170 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
12180 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
12190 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
121a0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
121b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
121c0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
121d0 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
121e0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
121f0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
12200 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
12210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12220 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
12230 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
12240 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
12250 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
12260 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
12270 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
12280 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
12290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
122a0 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
122b0 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
122c0 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
122d0 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
122e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
122f0 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
12300 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
12310 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12320 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
12330 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12340 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
12350 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
12360 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
12370 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
12380 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
12390 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
123a0 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
123b0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
123c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
123d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
12420 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
12430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12470 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
12490 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
124a0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
124b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
124d0 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
124e0 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
124f0 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
12500 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
12510 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61   files (really a
12520 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63   directory) to c
12530 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
12540 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
12550 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e  This works.** on
12560 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72   just about ever
12570 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61  y filesystem ima
12580 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ginable.  But th
12590 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20  ere are serious 
125a0 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a  downsides:.**.**
125b0 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69      (1)  There i
125c0 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e  s zero concurren
125d0 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65  cy.  A single re
125e0 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20  ader blocks all 
125f0 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
12600 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
12610 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  m reading or wri
12620 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
12630 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
12640 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   An application 
12650 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
12660 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74  oss can leave st
12670 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a  ale lock files.*
12680 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e  *         sittin
12690 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65  g around that ne
126a0 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64  ed to be cleared
126b0 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a   manually..**.**
126c0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61   Nevertheless, a
126d0 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61   dotlock is an a
126e0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
126f0 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20  ng mode for use 
12700 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c  if no.** other l
12710 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
12720 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
12730 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b  .** Dotfile lock
12740 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65  ing works by cre
12750 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63  ating a subdirec
12760 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65  tory in the same
12770 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a   directory as.**
12780 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
12790 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
127a0 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
127b0 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
127c0 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
127d0 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c  existence of a l
127e0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d  ock directory im
127f0 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
12800 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
12810 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65  her.** lock type
12820 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
12830 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
12840 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
12850 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
12860 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
12870 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
12880 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
12890 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
128a0 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
128b0 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a  k directory..*/.
128c0 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
128d0 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
128e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
128f0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
12900 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
12910 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
12920 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
12930 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
12940 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
12950 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
12960 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
12970 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
12980 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
12990 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
129a0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
129b0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
129c0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
129d0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
129e0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
129f0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
12a00 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
12a10 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
12a20 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
12a30 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
12a40 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
12a50 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
12a60 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
12a70 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
12a80 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
12a90 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
12aa0 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
12ab0 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
12ac0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
12ad0 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
12ae0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
12af0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
12b00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
12b10 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
12b20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12b30 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
12b40 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
12b50 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12b60 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
12b70 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12b80 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
12b90 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
12ba0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
12bb0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
12bc0 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d 20  );.  reserved = 
12bd0 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74 20  osAccess((const 
12be0 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
12bf0 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29 3d  kingContext, 0)=
12c00 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  =0;.  OSTRACE(("
12c10 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
12c20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
12c30 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
12c40 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
12c50 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
12c60 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
12c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
12c80 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
12c90 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
12ca0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
12cb0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
12cc0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12cd0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
12ce0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
12cf0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
12d00 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
12d10 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
12d20 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
12d30 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
12d40 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
12d50 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
12d60 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
12d70 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
12d80 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
12d90 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
12da0 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
12db0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
12dc0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
12dd0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
12de0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
12df0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
12e00 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
12e10 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
12e20 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
12e30 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
12e40 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
12e50 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
12e60 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
12e70 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
12e80 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
12e90 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
12ea0 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
12eb0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
12ec0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
12ed0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
12ee0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
12ef0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
12f00 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
12f10 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
12f20 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
12f30 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
12f40 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
12f50 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
12f60 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
12f70 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
12f80 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
12f90 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
12fa0 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
12fb0 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
12fc0 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
12fd0 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
12fe0 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
12ff0 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
13000 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
13010 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
13020 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
13030 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13040 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13050 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13060 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13070 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
13080 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
13090 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
130a0 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20  ntext;.  int rc 
130b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
130c0 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61   /* If we have a
130d0 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ny lock, then th
130e0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  e lock file alre
130f0 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c  ady exists.  All
13100 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
13110 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75   do is adjust ou
13120 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  r internal recor
13130 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65  d of the lock le
13140 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  vel..  */.  if( 
13150 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13160 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20   > NO_LOCK ){.  
13170 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13180 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13190 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
131a0 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
131b0 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
131c0 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56  le */.#ifdef HAV
131d0 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d  E_UTIME.    utim
131e0 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  e(zLockFile, NUL
131f0 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74  L);.#else.    ut
13200 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
13210 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
13220 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13230 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
13240 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
13250 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d  e lock */.  rc =
13260 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69   osMkdir(zLockFi
13270 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28  le, 0777);.  if(
13280 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   rc<0 ){.    /* 
13290 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
132a0 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64  reate the lock d
132b0 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
132c0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
132d0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
132e0 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
132f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13300 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
13310 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
13320 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13330 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13340 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
13350 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
13360 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
13370 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
13380 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
13390 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
133a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
133b0 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20  rn rc;.  } .  . 
133c0 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
133d0 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
133e0 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
133f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
13400 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
13410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13420 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
13430 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
13440 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
13450 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
13460 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
13470 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
13480 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
13490 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
134a0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
134b0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
134c0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
134d0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
134e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
134f0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
13500 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13510 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
13520 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
13530 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
13540 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
13550 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
13560 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
13570 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
13580 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
13590 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
135a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
135b0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
135c0 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
135d0 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
135e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
135f0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
13600 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
13610 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
13620 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
13630 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d=%d (dotlock)\n
13640 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
13650 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
13660 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13670 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ock, osGetpid(0)
13680 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
13690 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
136a0 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
136b0 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
136c0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
136d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
136e0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
136f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13700 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77    }..  /* To dow
13710 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64  ngrade to shared
13720 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20  , simply update 
13730 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74  our internal not
13740 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
13750 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20  lock state.  No 
13760 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74  need to mess wit
13770 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  h the file on di
13780 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  sk..  */.  if( e
13790 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
137a0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
137b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
137c0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
137d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
137e0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  K;.  }.  .  /* T
137f0 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74  o fully unlock t
13800 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c  he database, del
13810 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
13820 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  e */.  assert( e
13830 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
13840 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d  K );.  rc = osRm
13850 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a  dir(zLockFile);.
13860 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
13870 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
13880 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74 45  rrno;.    if( tE
13890 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a  rrno==ENOENT ){.
138a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
138b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
138c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
138d0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
138e0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
138f0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
13900 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
13910 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
13920 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13930 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
13940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
13960 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
13970 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
13980 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
13990 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
139a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
139b0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
139c0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
139d0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
139e0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
139f0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
13a00 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   );.  dotlockUnl
13a10 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
13a20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
13a30 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
13a40 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75 72  ontext);.  retur
13a50 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
13a60 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  id);.}./********
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
13a80 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
13a90 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
13aa0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
13ab0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b00 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
13b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b50 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
13b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b70 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
13b80 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
13b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ba0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
13bb0 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
13bc0 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
13bd0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
13be0 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
13bf0 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
13c00 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
13c10 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
13c20 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
13c30 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
13c40 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
13c50 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
13c60 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
13c70 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
13c80 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
13c90 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
13ca0 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
13cb0 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
13cc0 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
13cd0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
13ce0 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
13cf0 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
13d00 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
13d10 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
13d20 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
13d30 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
13d40 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
13d50 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
13d60 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
13d70 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
13d80 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
13d90 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
13da0 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
13db0 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
13dc0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13dd0 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  YLE../*.** Retry
13de0 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74   flock() calls t
13df0 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49  hat fail with EI
13e00 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49  NTR.*/.#ifdef EI
13e10 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72  NTR.static int r
13e20 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20  obust_flock(int 
13e30 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  fd, int op){.  i
13e40 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
13e50 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20  = flock(fd,op); 
13e60 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
13e70 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
13e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
13e90 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f  else.# define ro
13ea0 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20  bust_flock(a,b) 
13eb0 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69  flock(a,b).#endi
13ec0 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  f.     ../*.** T
13ed0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
13ee0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
13ef0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
13f00 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
13f10 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
13f20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
13f30 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
13f40 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
13f50 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
13f60 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
13f70 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
13f80 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
13f90 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
13fa0 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
13fb0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
13fc0 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
13fd0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13fe0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
13ff0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
14000 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  t flockCheckRese
14010 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
14020 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
14030 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
14040 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14050 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
14060 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
14070 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14080 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
14090 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
140a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
140b0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
140c0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
140d0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a  rt( pFile );.  .
140e0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
140f0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
14100 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
14110 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
14120 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
14130 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
14140 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
14150 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
14160 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
14170 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
14180 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
14190 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
141a0 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
141b0 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
141c0 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
141d0 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
141e0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
141f0 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
14200 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
14210 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
14220 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
14230 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72  */.      lrc = r
14240 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
14250 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
14260 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29        if ( lrc )
14270 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
14280 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
14290 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b         /* unlock
142a0 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20   failed with an 
142b0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
142c0 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f   lrc = SQLITE_IO
142d0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
142e0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
142f0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
14300 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
14310 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
14320 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
14330 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
14340 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72  rno;.      reser
14350 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  ved = 1;.      /
14360 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  * someone else m
14370 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73  ight have it res
14380 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c  erved */.      l
14390 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
143a0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
143b0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
143c0 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  ERR_LOCK); .    
143d0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
143e0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
143f0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
14400 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
14410 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
14420 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lrc;.      }.   
14430 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
14440 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
14450 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29  %d %d %d (flock)
14460 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
14470 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
14480 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
14490 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
144a0 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
144b0 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49   & 0xff) == SQLI
144c0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
144d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
144e0 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a      reserved=1;.
144f0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
14500 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
14510 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
14520 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
14530 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
14540 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
14550 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
14560 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
14570 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
14580 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
14590 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
145a0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
145b0 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
145c0 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
145d0 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
145e0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
145f0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
14600 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
14610 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
14620 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
14630 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
14640 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
14650 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
14660 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
14670 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
14680 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
14690 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
146a0 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
146b0 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
146c0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
146d0 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
146e0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
146f0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
14700 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
14710 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
14720 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
14730 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
14740 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
14750 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
14760 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
14770 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
14780 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
14790 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
147a0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
147b0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
147c0 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
147d0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
147e0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
147f0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
14800 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65   flock() only re
14810 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43  ally support EXC
14820 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57  LUSIVE locks.  W
14830 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64  e track intermed
14840 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61  iate.** lock sta
14850 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
14860 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
14870 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73  e, but all locks
14880 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62   SHARED or.** ab
14890 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45  ove are really E
148a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61  XCLUSIVE locks a
148b0 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f  nd exclude all o
148c0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66  ther processes f
148d0 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68  rom.** access th
148e0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
148f0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
14900 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
14910 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
14920 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
14930 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
14940 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
14950 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
14960 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71  int flockLock(sq
14970 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
14980 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
14990 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
149a0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
149b0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
149c0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
149d0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
149e0 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
149f0 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
14a00 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
14a10 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
14a20 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
14a30 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
14a40 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
14a50 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
14a60 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
14a70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14a80 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
14a90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14aa0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
14ab0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
14ac0 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72  ck */.  .  if (r
14ad0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
14ae0 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
14af0 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20  LOCK_NB)) {.    
14b00 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
14b10 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27  no;.    /* didn'
14b20 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
14b30 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  usy */.    rc = 
14b40 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14b50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14b60 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
14b70 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
14b80 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
14b90 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
14ba0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
14bb0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
14bc0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
14bd0 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
14be0 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
14bf0 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ok */.    pFile-
14c00 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14c10 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53  leLock;.  }.  OS
14c20 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
14c30 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29  %d %s %s (flock)
14c40 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
14c50 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
14c60 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
14c70 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
14c80 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
14c90 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  "));.#ifdef SQLI
14ca0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
14cb0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
14cc0 28 20 28 72 63 20 26 20 30 78 66 66 29 20 3d 3d  ( (rc & 0xff) ==
14cd0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
14ce0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14cf0 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BUSY;.  }.#endi
14d00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
14d10 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
14d20 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  RORS */.  return
14d30 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c   rc;.}.../*.** L
14d40 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
14d50 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
14d60 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
14d70 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
14d80 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
14d90 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
14da0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
14db0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
14dc0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
14dd0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
14de0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
14df0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
14e00 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
14e10 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
14e20 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
14e30 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
14e40 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  nt flockUnlock(s
14e50 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14e60 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
14e70 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
14e80 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14e90 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
14ea0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
14eb0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
14ec0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
14ed0 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
14ee0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
14ef0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
14f00 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
14f10 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
14f20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
14f30 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
14f40 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
14f50 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
14f60 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
14f70 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
14f80 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
14f90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14fa0 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
14fb0 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
14fc0 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
14fd0 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
14fe0 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
14ff0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
15000 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
15010 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
15020 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
15030 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15040 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
15050 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
15060 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
15070 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
15080 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
15090 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
150a0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
150b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
150c0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
150d0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
150e0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
150f0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
15100 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
15110 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
15120 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15130 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
15140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15150 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
15160 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
15170 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
15180 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
15190 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73 73  ile *id) {.  ass
151a0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
151b0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
151c0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75  NO_LOCK);.  retu
151d0 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
151e0 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  (id);.}..#endif 
151f0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
15200 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
15210 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a  & !OS_VXWORK */.
15220 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
15230 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
15240 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c   flock lock impl
15250 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
15260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15270 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
152c0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
152d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15310 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
15320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
15330 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65   Named Semaphore
15340 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
15350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15360 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  *.**.** Named se
15370 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
15380 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
15390 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  d on VxWorks..**
153a0 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
153b0 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
153c0 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b  t-lock and flock
153d0 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c   in that it real
153e0 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f  ly only.** suppo
153f0 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  rts EXCLUSIVE lo
15400 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73  cking.  Only a s
15410 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
15420 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  n read or write.
15430 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
15440 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20  file at a time. 
15450 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f   This reduces po
15460 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65  tential concurre
15470 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65  ncy, but.** make
15480 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  s the lock imple
15490 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65  mentation much e
154a0 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53  asier..*/.#if OS
154b0 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
154c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
154d0 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
154e0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
154f0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
15500 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
15510 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
15520 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
15530 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
15540 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
15550 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
15560 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
15570 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
15580 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
15590 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
155a0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
155b0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
155c0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
155d0 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
155e0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
155f0 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65  nt semXCheckRese
15600 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
15610 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
15620 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
15630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15640 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
15650 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
15660 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15670 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
15680 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
15690 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
156a0 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
156b0 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
156c0 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
156d0 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
156e0 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
156f0 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
15700 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
15710 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
15720 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
15730 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
15740 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
15750 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
15760 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
15770 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
15780 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
15790 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  .    sem_t *pSem
157a0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
157b0 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28  ->pSem;..    if(
157c0 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
157d0 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
157e0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
157f0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
15800 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
15810 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
15820 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
15830 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
15840 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
15850 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
15860 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  ;.        storeL
15870 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
15880 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
15890 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
158a0 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
158b0 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65  has the lock whe
158c0 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c  n we are in NO_L
158d0 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  OCK */.        r
158e0 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65  eserved = (pFile
158f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48  ->eFileLock < SH
15900 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
15910 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
15920 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64       /* we could
15930 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77   have it if we w
15940 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ant it */.      
15950 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a  sem_post(pSem);.
15960 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
15970 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
15980 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65 6d  CK %d %d %d (sem
15990 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
159a0 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
159b0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
159c0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
159d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
159e0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
159f0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
15a00 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
15a10 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
15a20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
15a30 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
15a40 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
15a50 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
15a60 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
15a70 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
15a80 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
15a90 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
15aa0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
15ab0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
15ac0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
15ad0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
15ae0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
15af0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
15b00 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
15b10 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
15b20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
15b30 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
15b40 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
15b50 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
15b60 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
15b70 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
15b80 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
15b90 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
15ba0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
15bb0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
15bc0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
15bd0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
15be0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
15bf0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
15c00 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
15c10 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
15c20 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
15c30 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
15c40 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
15c50 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
15c60 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
15c70 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
15c80 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
15c90 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73   Semaphore locks
15ca0 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
15cb0 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
15cc0 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
15cd0 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
15ce0 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
15cf0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
15d00 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
15d10 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
15d20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
15d30 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
15d40 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
15d50 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
15d60 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
15d70 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
15d80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15d90 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
15da0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
15db0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
15dc0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
15dd0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
15de0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
15df0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
15e00 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
15e10 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
15e20 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
15e30 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
15e40 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
15e50 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
15e60 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
15e70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15e80 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  E_OK;..  /* if w
15e90 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
15ea0 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
15eb0 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
15ec0 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
15ed0 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
15ee0 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
15ef0 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
15f00 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  ck > NO_LOCK) {.
15f10 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15f20 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
15f30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
15f40 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73  E_OK;.    goto s
15f50 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
15f60 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65  .  .  /* lock se
15f70 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20  maphore now but 
15f80 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c  bail out when al
15f90 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f  ready locked. */
15fa0 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61  .  if( sem_trywa
15fb0 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
15fc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15fd0 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73  BUSY;.    goto s
15fe0 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
15ff0 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73  ..  /* got it, s
16000 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
16010 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
16020 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16030 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73  = eFileLock;.. s
16040 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72  em_end_lock:.  r
16050 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16060 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
16070 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
16080 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
16090 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
160a0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
160b0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
160c0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
160d0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
160e0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
160f0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
16100 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
16110 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
16120 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
16130 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
16140 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16150 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
16160 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63  ic int semXUnloc
16170 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
16180 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
16190 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
161a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
161b0 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20  le*)id;.  sem_t 
161c0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
161d0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20  Inode->pSem;..  
161e0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
161f0 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20  .  assert( pSem 
16200 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
16210 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
16220 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29   %d pid=%d (sem)
16230 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
16240 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
16250 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
16260 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
16270 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
16280 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
16290 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
162a0 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
162b0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
162c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
162d0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
162e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
162f0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
16300 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
16310 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
16320 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
16330 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
16340 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
16350 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
16360 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16370 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
16380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16390 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
163a0 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63  no, really unloc
163b0 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d  k. */.  if ( sem
163c0 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20  _post(pSem)==-1 
163d0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20  ) {.    int rc, 
163e0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
163f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
16400 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
16410 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
16420 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
16430 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
16440 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
16450 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
16460 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
16470 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
16480 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
16490 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
164a0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
164b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
164c0 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
164d0 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
164e0 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28  c int semXClose(
164f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
16500 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
16510 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
16520 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
16530 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c  )id;.    semXUnl
16540 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
16550 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
16560 69 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ile );.    asser
16570 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78  t( unixFileMutex
16580 4e 6f 74 68 65 6c 64 28 70 46 69 6c 65 29 20 29  Notheld(pFile) )
16590 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
165a0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65  utex();.    rele
165b0 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
165c0 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  le);.    unixLea
165d0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63  veMutex();.    c
165e0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
165f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16600 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
16610 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
16620 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64  S */./*.** Named
16630 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
16640 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
16650 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  able on VxWorks.
16660 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
16670 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
16680 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
16690 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
166a0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
166b0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
166c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16700 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
16710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16750 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
16760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16770 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b  * Begin AFP Lock
16780 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
16790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
167a0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20  *****.**.** AFP 
167b0 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c  is the Apple Fil
167c0 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41  ing Protocol.  A
167d0 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20  FP is a network 
167e0 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64  filesystem found
167f0 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63  .** on Apple Mac
16800 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73  intosh computers
16810 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20   - both OS9 and 
16820 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64  OSX..**.** Third
16830 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74  -party implement
16840 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72  ations of AFP ar
16850 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  e available.  Bu
16860 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65  t this code here
16870 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  .** only works o
16880 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64  n OSX..*/..#if d
16890 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
168a0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
168b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
168c0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f  ./*.** The afpLo
168d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
168e0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
168f0 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
16900 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74  cific state.*/.t
16910 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
16920 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16930 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16940 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
16950 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
16960 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20  int reserved;.  
16970 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
16980 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
16990 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
169a0 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  pen file */.};..
169b0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
169c0 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
169d0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
169e0 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
169f0 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
16a00 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
16a10 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
16a20 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
16a30 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
16a40 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
16a50 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
16a60 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
16a70 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
16a80 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
16a90 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
16aa0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
16ab0 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
16ac0 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
16ad0 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
16ae0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
16af0 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
16b00 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
16b10 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
16b20 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
16b30 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b50 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
16b60 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
16b70 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
16b80 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
16b90 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20  ngeLock2FSCTL   
16ba0 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20       _IOWR('z', 
16bb0 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
16bc0 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a  angeLockPB2)../*
16bd0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
16be0 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e  ility for settin
16bf0 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20  g or clearing a 
16c00 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f  bit-range lock o
16c10 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65  n an.** AFP file
16c20 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52  system..** .** R
16c30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
16c40 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
16c50 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75  TE_BUSY on failu
16c60 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
16c70 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20  t afpSetLock(.  
16c80 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
16c90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
16ca0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
16cb0 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
16cc0 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  or unlocked */. 
16cd0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16ce0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16cf0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
16d00 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20  criptor on path 
16d10 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
16d20 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20  ng long offset, 
16d30 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
16d40 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
16d50 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
16d60 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20  g long length,  
16d70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16d80 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
16d90 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c  .  int setLockFl
16da0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
16db0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74    /* True to set
16dc0 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f   lock.  False to
16dd0 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29   clear lock */.)
16de0 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
16df0 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a  angeLockPB2 pb;.
16e00 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
16e10 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20  pb.unLockFlag = 
16e20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20  setLockFlag ? 0 
16e30 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45  : 1;.  pb.startE
16e40 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62  ndFlag = 0;.  pb
16e50 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .offset = offset
16e60 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20  ;.  pb.length = 
16e70 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64  length; .  pb.fd
16e80 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a   = pFile->h;.  .
16e90 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
16ea0 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20  ETLOCK [%s] for 
16eb0 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c  %d%s in range %l
16ec0 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20  lx:%llx\n", .   
16ed0 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f   (setLockFlag?"O
16ee0 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65  N":"OFF"), pFile
16ef0 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f  ->h, (pb.fd==-1?
16f00 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22  "[testval-1]":""
16f10 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c  ),.    offset, l
16f20 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d  ength));.  err =
16f30 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
16f40 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
16f50 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
16f60 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
16f70 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
16f80 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
16f90 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
16fa0 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
16fb0 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
16fc0 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
16fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
16fe0 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
16ff0 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a  rror(tErrno)));.
17000 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
17010 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
17020 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51  RORS.    rc = SQ
17030 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65  LITE_BUSY;.#else
17040 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17050 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
17060 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20  ror(tErrno,.    
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51  setLockFlag ? SQ
17090 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20  LITE_IOERR_LOCK 
170a0 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  : SQLITE_IOERR_U
170b0 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f  NLOCK);.#endif /
170c0 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
170d0 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  AFP_LOCK_ERRORS 
170e0 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  */.    if( IS_LO
170f0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
17100 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
17110 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
17120 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  no);.    }.    r
17130 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c  eturn rc;.  } el
17140 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
17150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
17160 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
17170 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
17180 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
17190 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
171a0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
171b0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
171c0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
171d0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
171e0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
171f0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
17200 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
17210 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
17220 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
17230 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
17240 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
17250 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
17260 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
17270 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
17280 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
17290 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68  static int afpCh
172a0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
172b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
172c0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
172d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
172e0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
172f0 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
17300 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
17310 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
17320 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
17330 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  t *context;.  . 
17340 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17350 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
17360 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
17370 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
17380 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
17390 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 61  ;.  context = (a
173a0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
173b0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
173c0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28  ngContext;.  if(
173d0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
173e0 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f  ed ){.    *pResO
173f0 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ut = 1;.    retu
17400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17410 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
17420 78 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e 70  x_enter(pFile->p
17430 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
17440 78 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  x);.  /* Check i
17450 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
17460 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
17470 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
17480 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
17490 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
174a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
174b0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
174c0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
174d0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
174e0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
174f0 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a  holds it..   */.
17500 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
17510 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74  ){.    /* lock t
17520 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65  he RESERVED byte
17530 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
17540 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17550 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17560 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
17570 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20  TE, 1,1);  .    
17580 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c  if( SQLITE_OK==l
17590 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  rc ){.      /* i
175a0 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
175b0 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73  n taking the res
175c0 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  erved lock, unlo
175d0 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  ck it to restore
175e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
175f0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a  iginal state */.
17600 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53        lrc = afpS
17610 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17620 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
17630 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
17640 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20   0);.    } else 
17650 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
17660 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
17670 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
17680 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
17690 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
176a0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
176b0 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
176c0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
176d0 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a  {.      rc=lrc;.
176e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73      }.  }.  .  s
176f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
17700 76 65 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ve(pFile->pInode
17710 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20  ->pLockMutex);. 
17720 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
17730 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
17740 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
17750 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
17760 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f  d));.  .  *pResO
17770 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
17780 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17790 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
177a0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
177b0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
177c0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
177d0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
177e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
177f0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
17800 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
17810 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
17820 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
17830 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
17840 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
17850 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
17860 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
17870 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
17880 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
17890 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
178a0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
178b0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
178c0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
178d0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
178e0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
178f0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
17900 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
17910 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
17920 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
17930 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
17940 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
17950 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
17960 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
17970 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
17980 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
17990 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
179a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
179b0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
179c0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
179d0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
179e0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
179f0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
17a00 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
17a10 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
17a20 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
17a30 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
17a40 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
17a50 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
17a60 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
17a70 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
17a80 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
17a90 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
17aa0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
17ab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
17ac0 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  pLock(sqlite3_fi
17ad0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
17ae0 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
17af0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17b00 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
17b10 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
17b20 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
17b30 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
17b40 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c  ->pInode;.  afpL
17b50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
17b60 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
17b70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
17b80 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
17b90 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72  text;.  .  asser
17ba0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
17bb0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
17bc0 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
17bd0 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
17be0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
17bf0 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
17c00 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
17c10 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
17c20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
17c30 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
17c40 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69  Lock(pInode->eFi
17c50 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d  leLock), pInode-
17c60 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74  >nShared , osGet
17c70 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20  pid(0)));..  /* 
17c80 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
17c90 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
17ca0 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
17cb0 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
17cc0 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
17cd0 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
17ce0 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
17cf0 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
17d00 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
17d10 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
17d20 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
17d30 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
17d40 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17d50 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
17d60 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
17d70 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
17d80 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61  already held) (a
17d90 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
17da0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
17db0 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
17dc0 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
17dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17de0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
17df0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
17e00 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
17e10 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
17e20 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
17e30 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
17e40 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
17e50 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
17e60 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
17e70 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
17e80 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
17e90 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
17ea0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
17eb0 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
17ec0 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
17ed0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
17ee0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
17ef0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
17f00 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
17f10 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
17f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
17f30 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
17f40 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
17f50 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
17f60 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
17f70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
17f80 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17f90 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74    .  /* This mut
17fa0 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
17fb0 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
17fc0 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
17fd0 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
17fe0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
17ff0 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71 6c  e->pInode;.  sql
18000 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
18010 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
18020 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  tex);..  /* If s
18030 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
18040 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
18050 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
18060 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
18070 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
18080 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
18090 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
180a0 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
180b0 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46    if( (pFile->eF
180c0 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d  ileLock!=pInode-
180d0 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20  >eFileLock && . 
180e0 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
180f0 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
18100 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
18110 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
18120 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63  ).     ){.    rc
18130 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
18140 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
18150 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
18160 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
18170 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
18180 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
18190 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
181a0 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
181b0 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
181c0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
181d0 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
181e0 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
181f0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
18200 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
18210 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
18220 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
18230 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
18240 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
18250 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
18260 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
18270 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
18280 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
18290 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
182a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
182b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
182c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
182d0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
182e0 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
182f0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
18300 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
18310 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
18320 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
18330 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  k++;.    goto af
18340 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
18350 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44      .  /* A PEND
18360 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
18370 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
18380 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
18390 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
183a0 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
183b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
183c0 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
183d0 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
183e0 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
183f0 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  leased..  */.  i
18400 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
18410 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
18420 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
18430 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
18440 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
18450 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
18460 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61  .  ){.    int fa
18470 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64  iled;.    failed
18480 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18490 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
184a0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
184b0 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  TE, 1, 1);.    i
184c0 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20  f (failed) {.   
184d0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
184e0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
184f0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
18500 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f   }.  .  /* If co
18510 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
18520 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
18530 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
18540 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
18550 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
18560 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
18570 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
18580 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
18590 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
185a0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c  ){.    int lrc1,
185b0 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f   lrc2, lrc1Errno
185c0 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c   = 0;.    long l
185d0 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20  k, mask;.    .  
185e0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
185f0 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
18600 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
18610 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
18620 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   );.        .   
18630 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28   mask = (sizeof(
18640 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47  long)==8) ? LARG
18650 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66  EST_INT64 : 0x7f
18660 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e  ffffff;.    /* N
18670 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
18680 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b  lock SHARED_LOCK
18690 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20   */.    /* note 
186a0 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79  that the quality
186b0 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65   of the randomne
186c0 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ss doesn't matte
186d0 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20  r that much */. 
186e0 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29     lk = random()
186f0 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73  ; .    pInode->s
18700 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20  haredByte = (lk 
18710 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f  & mask)%(SHARED_
18720 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c  SIZE - 1);.    l
18730 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  rc1 = afpSetLock
18740 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18750 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
18760 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
18770 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
18780 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
18790 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
187a0 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20  R(lrc1) ){.     
187b0 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69   lrc1Errno = pFi
187c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
187d0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70     }.    /* Drop
187e0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
187f0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
18800 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74     lrc2 = afpSet
18810 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
18820 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
18830 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
18840 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49  ;.    .    if( I
18850 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
18860 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74 6f  1) ) {.      sto
18870 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
18880 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20  e, lrc1Errno);. 
18890 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
188a0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
188b0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
188c0 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f  lse if( IS_LOCK_
188d0 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20  ERROR(lrc2) ){. 
188e0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a       rc = lrc2;.
188f0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
18900 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
18910 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20  lse if( lrc1 != 
18920 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
18930 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
18940 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
18950 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
18960 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
18970 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
18980 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
18990 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d  Inode->nShared =
189a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
189b0 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
189c0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
189d0 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  && pInode->nShar
189e0 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ed>1 ){.    /* W
189f0 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
18a00 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
18a10 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
18a20 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
18a30 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
18a40 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
18a50 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
18a60 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
18a70 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
18a80 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
18a90 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
18aa0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
18ab0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
18ac0 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
18ad0 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
18ae0 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
18af0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
18b00 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
18b10 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
18b20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
18b30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
18b40 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
18b50 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69  k );.    if (eFi
18b60 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56  leLock >= RESERV
18b70 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
18b80 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45  ->eFileLock < RE
18b90 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
18ba0 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
18bb0 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
18bc0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
18bd0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
18be0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18bf0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
18c00 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20  D_BYTE, 1,1);.  
18c10 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20      if( !failed 
18c20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  ){.        conte
18c30 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31  xt->reserved = 1
18c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18c50 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20      if (!failed 
18c60 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20  && eFileLock == 
18c70 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
18c80 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69  {.      /* Acqui
18c90 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
18ca0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
18cb0 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  .      /* Remove
18cc0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
18cd0 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   before trying t
18ce0 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c  he range.  we'll
18cf0 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20   need to .      
18d00 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  ** reestablish t
18d10 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
18d20 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74  f we can't get t
18d30 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20  he  afpUnlock.  
18d40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
18d50 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53   !(failed = afpS
18d60 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
18d70 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
18d80 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18da0 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73         pInode->s
18db0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29  haredByte, 1, 0)
18dc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
18dd0 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54   failed2 = SQLIT
18de0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a  E_OK;.        /*
18df0 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
18e00 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
18e10 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
18e20 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
18e30 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
18e40 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
18e50 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
18e60 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e80 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
18e90 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
18ea0 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65  failed && (faile
18eb0 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  d2 = afpSetLock(
18ec0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18ed0 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ef0 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70  SHARED_FIRST + p
18f00 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
18f10 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
18f20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
18f30 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
18f40 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
18f50 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
18f60 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
18f70 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
18f80 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
18f90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18fa0 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
18fb0 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49 54  & 0xff) == SQLIT
18fc0 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65  E_IOERR) ? faile
18fd0 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20  d2 : .          
18fe0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
18ff0 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
19000 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
19010 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  ock;.        } .
19020 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19030 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
19040 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ; .      }.    }
19050 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20  .    if( failed 
19060 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61  ){.      rc = fa
19070 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iled;.    }.  }.
19080 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
19090 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
190a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
190b0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
190c0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
190d0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
190e0 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
190f0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
19100 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
19110 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
19120 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
19130 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
19140 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
19150 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e  K;.  }.  .afp_en
19160 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74 65  d_lock:.  sqlite
19170 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49  3_mutex_leave(pI
19180 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
19190 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
191a0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
191b0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
191c0 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
191d0 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
191e0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
191f0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
19200 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
19210 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
19220 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
19230 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
19240 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
19250 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
19260 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
19270 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
19280 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
19290 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
192a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
192b0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
192c0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
192d0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
192e0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
192f0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
19300 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
19310 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
19320 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69  t afpUnlock(sqli
19330 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
19340 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
19350 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19360 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
19370 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
19380 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
19390 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
193a0 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
193b0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
193c0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
193d0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
193e0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
193f0 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
19400 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
19410 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
19420 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
19430 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
19440 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
19450 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
19460 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
19470 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
19480 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
19490 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
194a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
194b0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
194c0 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
194d0 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
194e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
194f0 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61  etpid(0)));..  a
19500 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
19510 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
19520 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
19530 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
19540 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
19550 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19560 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
19570 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71 6c 69  ->pInode;.  sqli
19580 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
19590 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
195a0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ex);.  assert( p
195b0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
195c0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
195d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
195e0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
195f0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
19600 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
19610 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
19620 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19630 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
19640 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19650 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
19660 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
19670 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66  ign(0);.    .#if
19680 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
19690 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
196a0 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
196b0 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
196c0 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
196d0 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
196e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
196f0 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
19700 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
19710 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
19720 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
19730 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
19740 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
19750 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
19760 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
19770 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
19780 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
19790 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
197a0 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
197b0 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
197c0 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
197d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
197e0 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
197f0 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
19800 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
19810 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
19820 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
19830 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
19840 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
19850 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
19860 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
19870 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
19880 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
19890 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
198a0 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
198b0 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
198c0 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
198d0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
198e0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
198f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
19900 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
19910 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19920 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
19930 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
19940 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
19950 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
19960 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  RST, SHARED_SIZE
19970 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19990 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
199a0 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
199b0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29  de->nShared>1) )
199c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c  {.        /* onl
199d0 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74  y re-establish t
199e0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
199f0 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
19a00 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65         int share
19a10 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
19a20 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
19a30 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
19a40 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
19a50 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
19a60 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
19a70 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
19a80 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
19a90 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53   {.        skipS
19aa0 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  hared = 1;.     
19ab0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
19ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19ad0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
19ae0 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
19af0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
19b00 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
19b10 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
19b20 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
19b30 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20  1, 0);.    } .  
19b40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19b50 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
19b60 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ileLock>=RESERVE
19b70 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78  D_LOCK && contex
19b80 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
19b90 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
19ba0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
19bb0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
19bc0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
19bd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63  );.      if( !rc
19be0 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e   ){ .        con
19bf0 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
19c00 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20   0; .      }.   
19c10 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
19c20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
19c30 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
19c40 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
19c50 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20  Shared>1)){.    
19c60 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
19c70 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
19c80 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
19c90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19ca0 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e   && eFileLock==N
19cb0 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f  O_LOCK ){..    /
19cc0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
19cd0 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
19ce0 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
19cf0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
19d00 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
19d10 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
19d20 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
19d30 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
19d40 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
19d50 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
19d60 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
19d70 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63  g long sharedLoc
19d80 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
19d90 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
19da0 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e  redByte;.    pIn
19db0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
19dc0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
19dd0 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
19de0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
19df0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
19e00 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
19e10 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
19e20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
19e30 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
19e40 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61      if( !skipSha
19e50 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
19e60 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
19e70 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
19e80 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
19e90 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  kByte, 1, 0);.  
19ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19eb0 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !rc ){.        p
19ec0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
19ed0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
19ee0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
19ef0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
19f00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19f10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  _OK ){.      pIn
19f30 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
19f40 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
19f50 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
19f60 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
19f70 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 20 63 6c 6f  ->nLock==0 ) clo
19f80 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
19f90 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  le);.    }.  }. 
19fa0 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   .  sqlite3_mute
19fb0 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e  x_leave(pInode->
19fc0 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 69  pLockMutex);.  i
19fd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19fe0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
19ff0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
1a000 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Lock;.  }.  retu
1a010 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a020 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63  Close a file & c
1a030 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69  leanup AFP speci
1a040 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  fic locking cont
1a050 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ext .*/.static i
1a060 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69  nt afpClose(sqli
1a070 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
1a080 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a090 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
1a0a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1a0b0 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72  ile*)id;.  asser
1a0c0 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 66  t( id!=0 );.  af
1a0d0 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
1a0e0 4f 43 4b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OCK);.  assert( 
1a0f0 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74  unixFileMutexNot
1a100 68 65 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a 20  held(pFile) );. 
1a110 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
1a120 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
1a130 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 75 6e  pInode ){.    un
1a140 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1a150 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
1a160 6f 64 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ode;.    sqlite3
1a170 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 49 6e  _mutex_enter(pIn
1a180 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29  ode->pLockMutex)
1a190 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
1a1a0 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->nLock ){.     
1a1b0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1a1c0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
1a1d0 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
1a1e0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
1a1f0 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a  le just.      **
1a200 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
1a210 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
1a220 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
1a230 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
1a240 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
1a250 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
1a260 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
1a270 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
1a280 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
1a290 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
1a2a0 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
1a2b0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1a2c0 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
1a2d0 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
1a2e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1a2f0 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c  leave(pInode->pL
1a300 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 20  ockMutex);.  }. 
1a310 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
1a320 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69  o(pFile);.  sqli
1a330 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
1a340 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
1a350 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
1a360 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69  xFile(id);.  uni
1a370 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
1a380 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1a390 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1a3a0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
1a3b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1a3c0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
1a3d0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
1a3e0 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f  ve is the AFP lo
1a3f0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
1a400 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
1a410 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
1a420 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
1a430 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
1a440 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
1a450 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
1a460 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
1a470 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20  .  If you don't 
1a480 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61  compile for a ma
1a490 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69  c, then the "uni
1a4a0 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73  x-afp".** VFS is
1a4b0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a   not available..
1a4c0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1a4d0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
1a4e0 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
1a4f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
1a500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a510 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1a520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a560 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
1a570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a5b0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1a5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1a5d0 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e  Begin NFS Lockin
1a5e0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
1a5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a600 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  **/..#if defined
1a610 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
1a620 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1a630 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a  KING_STYLE./*. *
1a640 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
1a650 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
1a660 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
1a670 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
1a680 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20    eFileLock. ** 
1a690 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
1a6a0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
1a6b0 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49  _LOCK.. **. ** I
1a6c0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
1a6d0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
1a6e0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
1a6f0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
1a700 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73  w. ** the reques
1a710 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
1a720 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
1a730 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a  is a no-op.. */.
1a740 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e  static int nfsUn
1a750 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
1a760 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
1a770 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20  Lock){.  return 
1a780 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
1a790 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d  eFileLock, 1);.}
1a7a0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
1a7b0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1a7c0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1a7d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
1a7e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
1a7f0 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53  above is the NFS
1a800 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
1a810 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
1a820 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
1a830 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
1a840 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
1a850 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
1a860 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
1a870 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
1a880 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  ble.  .**.******
1a890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1a8a0 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c  End of the NFS l
1a8b0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
1a8c0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
1a8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1a8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a920 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
1a930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1a980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d  *********** Non-
1a990 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  locking sqlite3_
1a9a0 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  file methods ***
1a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
1a9d0 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69   The next divisi
1a9e0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c  on contains impl
1a9f0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20  ementations for 
1aa00 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  all methods of t
1aa10 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  he .** sqlite3_f
1aa20 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72  ile object other
1aa30 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   than the lockin
1aa40 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20  g methods.  The 
1aa50 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f  locking.** metho
1aa60 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  ds were defined 
1aa70 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f  in divisions abo
1aa80 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20  ve (one locking 
1aa90 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69  method per.** di
1aaa0 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20  vision).  Those 
1aab0 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65  methods that are
1aac0 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c   common to all l
1aad0 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20  ocking modes.** 
1aae0 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74  are gather toget
1aaf0 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69  her into this di
1ab00 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  vision..*/../*.*
1ab10 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
1ab20 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74  fset passed as t
1ab30 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1ab40 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e  nt, then read cn
1ab50 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f  t .** bytes into
1ab60 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68   pBuf. Return th
1ab70 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1ab80 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
1ab90 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79  .**.** NB:  If y
1aba0 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ou define USE_PR
1abb0 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44  EAD or USE_PREAD
1abc0 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  64, then it migh
1abd0 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63  t also.** be nec
1abe0 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65  essary to define
1abf0 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74   _XOPEN_SOURCE t
1ac00 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20  o be 500.  This 
1ac10 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f  varies from.** o
1ac20 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f  ne system to ano
1ac30 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c  ther.  Since SQL
1ac40 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66  ite does not def
1ac50 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a  ine USE_PREAD.**
1ac60 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62 79 20   in any form by 
1ac70 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
1ac80 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
1ac90 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
1aca0 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
1acb0 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
1acc0 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  2681..**.** To a
1acd0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
1ace0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
1acf0 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74   a failed read t
1ad00 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1ad10 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1ad20 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1ad30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1ad40 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
1ad50 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
1ad60 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
1ad70 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
1ad80 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  ){.  int got;.  
1ad90 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23  int prior = 0;.#
1ada0 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
1adb0 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
1adc0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
1add0 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
1ade0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
1adf0 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73 65 72  R_START;.  asser
1ae00 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31  t( cnt==(cnt&0x1
1ae10 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  ffff) );.  asser
1ae20 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20  t( id->h>2 );.  
1ae30 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  do{.#if defined(
1ae40 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67  USE_PREAD).    g
1ae50 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d  ot = osPread(id-
1ae60 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
1ae70 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
1ae80 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
1ae90 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
1aea0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1aeb0 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  64).    got = os
1aec0 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  Pread64(id->h, p
1aed0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
1aee0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1aef0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
1af00 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65   );.#else.    ne
1af10 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
1af20 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
1af30 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
1af40 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
1af50 65 77 4f 66 66 73 65 74 20 3d 20 2d 31 20 29 3b  ewOffset = -1 );
1af60 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
1af70 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 74  et<0 ){.      st
1af80 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1af90 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1afa0 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
1afb0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   -1;.    }.    g
1afc0 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e  ot = osRead(id->
1afd0 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
1afe0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67 6f  endif.    if( go
1aff0 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a  t==cnt ) break;.
1b000 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b      if( got<0 ){
1b010 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f  .      if( errno
1b020 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d  ==EINTR ){ got =
1b030 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a   1; continue; }.
1b040 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30 3b        prior = 0;
1b050 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
1b060 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a  Errno((unixFile*
1b070 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a 20 20  )id,  errno);.  
1b080 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b090 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29  else if( got>0 )
1b0a0 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67  {.      cnt -= g
1b0b0 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  ot;.      offset
1b0c0 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
1b0d0 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20  rior += got;.   
1b0e0 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
1b0f0 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70  )(got + (char*)p
1b100 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  Buf);.    }.  }w
1b110 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20  hile( got>0 );. 
1b120 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53   TIMER_END;.  OS
1b130 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20  TRACE(("READ    
1b140 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
1b150 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llu\n",.        
1b160 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70      id->h, got+p
1b170 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69  rior, offset-pri
1b180 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  or, TIMER_ELAPSE
1b190 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
1b1a0 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  t+prior;.}../*.*
1b1b0 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
1b1c0 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
1b1d0 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
1b1e0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
1b1f0 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
1b200 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
1b210 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
1b220 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1b230 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
1b240 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65  tatic int unixRe
1b250 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
1b260 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20  le *id, .  void 
1b270 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
1b280 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
1b290 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75  64 offset.){.  u
1b2a0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1b2b0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1b2c0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73  .  int got;.  as
1b2d0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
1b2e0 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
1b2f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
1b300 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
1b310 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
1b320 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
1b330 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
1b340 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
1b350 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
1b360 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
1b370 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
1b380 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
1b390 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
1b3a0 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
1b3b0 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65  le->pPreallocate
1b3c0 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  dUnused==0.     
1b3d0 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
1b3e0 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
1b3f0 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
1b400 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
1b410 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
1b420 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1b430 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
1b440 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
1b450 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72 65   of this read re
1b460 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
1b470 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
1b480 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
1b490 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
1b4a0 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
1b4b0 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
1b4c0 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
1b4d0 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
1b4e0 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
1b4f0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1b500 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
1b510 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
1b520 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1b530 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20  offset], amt);. 
1b540 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b550 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1b560 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  {.      int nCop
1b570 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  y = pFile->mmapS
1b580 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
1b590 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1b5a0 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
1b5b0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1b5c0 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20  fset], nCopy);. 
1b5d0 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
1b5e0 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
1b5f0 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
1b600 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
1b610 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
1b620 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1b630 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
1b640 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  ad(pFile, offset
1b650 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
1b660 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
1b670 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b680 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
1b690 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f  ( got<0 ){.    /
1b6a0 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
1b6b0 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
1b6c0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1b6d0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
1b6e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f    }else{.    sto
1b6f0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1b700 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20  e, 0);   /* not 
1b710 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1b720 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
1b730 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
1b740 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
1b750 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
1b760 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
1b770 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
1b780 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
1b790 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1b7a0 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
1b7b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1b7c0 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c   to seek the fil
1b7d0 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61 73  e-descriptor pas
1b7e0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1b7f0 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20   argument to.** 
1b800 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20  absolute offset 
1b810 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d  iOff, then attem
1b820 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66  pt to write nBuf
1b830 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
1b840 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69  rom.** pBuf to i
1b850 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
1b860 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31  ccurs, return -1
1b870 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e   and set *piErrn
1b880 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  o. Otherwise, .*
1b890 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63 74  * return the act
1b8a0 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ual number of by
1b8b0 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68 69  tes written (whi
1b8c0 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74  ch may be less t
1b8d0 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f  han.** nBuf)..*/
1b8e0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1b8f0 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e  AndWriteFd(.  in
1b900 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20  t fd,           
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b920 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1b930 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1b940 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20    i64 iOff,     
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74    /* File offset
1b970 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
1b980 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  g at */.  const 
1b990 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
1b9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
1b9b0 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  y data from this
1b9c0 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20 66   buffer to the f
1b9d0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75  ile */.  int nBu
1b9e0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1b9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1ba00 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66 20   of buffer pBuf 
1ba10 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
1ba20 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20  t *piErrno      
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ba40 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62   OUT: Error numb
1ba50 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75  er if error occu
1ba60 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  rs */.){.  int r
1ba70 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1ba80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1ba90 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1baa0 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a  system call */..
1bab0 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d    assert( nBuf==
1bac0 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20 29  (nBuf&0x1ffff) )
1bad0 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 32  ;.  assert( fd>2
1bae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 69   );.  assert( pi
1baf0 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e 42  Errno!=0 );.  nB
1bb00 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20  uf &= 0x1ffff;. 
1bb10 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23   TIMER_START;..#
1bb20 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1bb30 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d  READ).  do{ rc =
1bb40 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 28 66   (int)osPwrite(f
1bb50 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69  d, pBuf, nBuf, i
1bb60 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  Off); }while( rc
1bb70 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1bb80 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  TR );.#elif defi
1bb90 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
1bba0 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74  .  do{ rc = (int
1bbb0 29 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c 20  )osPwrite64(fd, 
1bbc0 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66  pBuf, nBuf, iOff
1bbd0 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  );}while( rc<0 &
1bbe0 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b  & errno==EINTR);
1bbf0 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20  .#else.  do{.   
1bc00 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65   i64 iSeek = lse
1bc10 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45  ek(fd, iOff, SEE
1bc20 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75  K_SET);.    Simu
1bc30 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65  lateIOError( iSe
1bc40 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69  ek = -1 );.    i
1bc50 66 28 20 69 53 65 65 6b 3c 30 20 29 7b 0a 20 20  f( iSeek<0 ){.  
1bc60 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1bc70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bc80 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69 74 65      rc = osWrite
1bc90 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 29  (fd, pBuf, nBuf)
1bca0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  ;.  }while( rc<0
1bcb0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1bcc0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49   );.#endif..  TI
1bcd0 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41  MER_END;.  OSTRA
1bce0 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE(("WRITE   %-3
1bcf0 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
1bd00 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66  \n", fd, rc, iOf
1bd10 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  f, TIMER_ELAPSED
1bd20 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30 20  ));..  if( rc<0 
1bd30 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72 72  ) *piErrno = err
1bd40 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  no;.  return rc;
1bd50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .}.../*.** Seek 
1bd60 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
1bd70 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
1bd80 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
1bd90 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
1bda0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1bdb0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1bdc0 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
1bdd0 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
1bde0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
1bdf0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
1be00 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
1be10 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
1be20 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1be30 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1be40 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1be50 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
1be60 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
1be70 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
1be80 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
1be90 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e 20   cnt){.  return 
1bea0 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 69  seekAndWriteFd(i
1beb0 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70 42  d->h, offset, pB
1bec0 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61  uf, cnt, &id->la
1bed0 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a  stErrno);.}.../*
1bee0 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
1bef0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
1bf00 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
1bf10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1bf20 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
1bf30 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
1bf40 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
1bf50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1bf60 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
1bf70 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
1bf80 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1bf90 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1bfa0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1bfb0 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
1bfc0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1bfd0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
1bfe0 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
1bff0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
1c000 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
1c010 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1c020 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1c030 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
1c040 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
1c050 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
1c060 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
1c070 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
1c080 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
1c090 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1c0a0 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
1c0b0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 50 72  sert( pFile->pPr
1c0c0 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
1c0d0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
1c0e0 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
1c0f0 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
1c100 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
1c110 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
1c120 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1c130 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
1c140 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1c150 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1c160 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
1c170 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
1c180 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68  o.  ** doing a h
1c190 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1c1a0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1c1b0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1c1c0 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f  r than a.  ** no
1c1d0 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  rmal database fi
1c1e0 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20  le) then record 
1c1f0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
1c200 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
1c210 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66  has changed.  If
1c220 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c230 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69   counter is modi
1c240 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61  fied, record tha
1c250 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e  t.  ** fact too.
1c260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1c270 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1c280 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   ){.    pFile->d
1c290 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a  bUpdate = 1;  /*
1c2a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68 61   The database ha
1c2b0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
1c2c0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  */.    if( offse
1c2d0 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b  t<=24 && offset+
1c2e0 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20  amt>=27 ){.     
1c2f0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63   int rc;.      c
1c300 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a  har oldCntr[4];.
1c310 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1c320 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1c330 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41        rc = seekA
1c340 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34  ndRead(pFile, 24
1c350 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20  , oldCntr, 4);. 
1c360 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1c370 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1c380 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c       if( rc!=4 |
1c390 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72  | memcmp(oldCntr
1c3a0 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  , &((char*)pBuf)
1c3b0 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21  [24-offset], 4)!
1c3c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1c3d0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1c3e0 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  ng = 1;  /* The 
1c3f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1c400 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20  ter has changed 
1c410 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
1c420 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1c430 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c440 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29 20  MMAP_READWRITE) 
1c450 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  && SQLITE_MAX_MM
1c460 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
1c470 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
1c480 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72   of this write r
1c490 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
1c4a0 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
1c4b0 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
1c4c0 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
1c4d0 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
1c4e0 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
1c4f0 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
1c500 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
1c510 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
1c520 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1c530 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1c540 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1c550 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1c560 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  t], pBuf, amt);.
1c570 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c580 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1c590 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
1c5a0 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  py = pFile->mmap
1c5b0 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
1c5c0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
1c5d0 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
1c5e0 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
1c5f0 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a  , pBuf, nCopy);.
1c600 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
1c610 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
1c620 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
1c630 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
1c640 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
1c650 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
1c660 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f 74 65  .  while( (wrote
1c670 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1c680 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
1c690 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74 20 26  Buf, amt))<amt &
1c6a0 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20 20 20  & wrote>0 ){.   
1c6b0 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
1c6c0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
1c6d0 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
1c6e0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
1c6f0 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
1c700 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
1c710 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
1c720 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
1c730 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
1c740 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
1c750 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72 6f 74  ..  if( amt>wrot
1c760 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  e ){.    if( wro
1c770 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c  te<0 && pFile->l
1c780 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43  astErrno!=ENOSPC
1c790 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
1c7a0 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
1c7b0 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
1c7c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c7d0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
1c7e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c7f0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
1c800 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74  File, 0); /* not
1c810 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
1c820 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1c830 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1c840 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1c850 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1c860 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1c870 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
1c880 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
1c890 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
1c8a0 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
1c8b0 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
1c8c0 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
1c8d0 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
1c8e0 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20 72  curring at the r
1c8f0 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69  ight times..*/.i
1c900 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  nt sqlite3_sync_
1c910 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73  count = 0;.int s
1c920 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
1c930 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
1c940 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e  f../*.** We do n
1c950 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d 73  ot trust systems
1c960 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f   to provide a wo
1c970 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28  rking fdatasync(
1c980 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20  ).  Some do..** 
1c990 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54  Others do no.  T
1c9a0 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77 69  o be safe, we wi
1c9b0 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74 68  ll stick with th
1c9c0 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  e (slightly slow
1c9d0 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20  er).** fsync(). 
1c9e0 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74  If you know that
1c9f0 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65   your system doe
1ca00 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73  s support fdatas
1ca10 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c  ync() correctly,
1ca20 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20  .** then simply 
1ca30 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66  compile with -Df
1ca40 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79  datasync=fdatasy
1ca50 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44 41  nc or -DHAVE_FDA
1ca60 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21 64  TASYNC.*/.#if !d
1ca70 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63  efined(fdatasync
1ca80 29 20 26 26 20 21 48 41 56 45 5f 46 44 41 54 41  ) && !HAVE_FDATA
1ca90 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64  SYNC.# define fd
1caa0 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65  atasync fsync.#e
1cab0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  ndif../*.** Defi
1cac0 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1cad0 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65  C to 0 or 1 depe
1cae0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1caf0 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46   or not.** the F
1cb00 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f  _FULLFSYNC macro
1cb10 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f   is defined.  F_
1cb20 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72  FULLFSYNC is cur
1cb30 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61  rently.** only a
1cb40 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20  vailable on Mac 
1cb50 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20  OS X.  But that 
1cb60 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f  could change..*/
1cb70 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53  .#ifdef F_FULLFS
1cb80 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56  YNC.# define HAV
1cb90 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65  E_FULLFSYNC 1.#e
1cba0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56  lse.# define HAV
1cbb0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65  E_FULLFSYNC 0.#e
1cbc0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ndif.../*.** The
1cbd0 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20   fsync() system 
1cbe0 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f  call does not wo
1cbf0 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64  rk as advertised
1cc00 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78   on many.** unix
1cc10 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66   systems.  The f
1cc20 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75  ollowing procedu
1cc30 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  re is an attempt
1cc40 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77   to make.** it w
1cc50 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a  ork better..**.*
1cc60 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  * The SQLITE_NO_
1cc70 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62  SYNC macro disab
1cc80 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73  les all fsync()s
1cc90 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75  .  This is usefu
1cca0 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  l.** for testing
1ccb0 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
1ccc0 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65   run through the
1ccd0 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63   test suite quic
1cce0 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20  kly..** You are 
1ccf0 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64  strongly advised
1cd00 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79   *not* to deploy
1cd10 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1cd20 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  SYNC.** enabled,
1cd30 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   however, since 
1cd40 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
1cd50 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20  YNC enabled, an 
1cd60 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70  OS crash.** or p
1cd70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c  ower failure wil
1cd80 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74  l likely corrupt
1cd90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cda0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  le..**.** SQLite
1cdb0 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e   sets the dataOn
1cdc0 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73  ly flag if the s
1cdd0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1cde0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  is unchanged..**
1cdf0 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64   The idea behind
1ce00 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61   dataOnly is tha
1ce10 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  t it should only
1ce20 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
1ce30 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69  content.** to di
1ce40 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64  sk, not the inod
1ce50 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20  e.  We only set 
1ce60 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20  dataOnly if the 
1ce70 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a  file size is .**
1ce80 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65   unchanged since
1ce90 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1cea0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  s part of the in
1ceb0 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a  ode.  However, .
1cec0 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c  ** Ted Ts'o tell
1ced0 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73  s us that fdatas
1cee0 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20  ync() will also 
1cef0 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20  write the inode 
1cf00 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73  if the.** file s
1cf10 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ize has changed.
1cf20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20    The only real 
1cf30 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1cf40 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a  en fdatasync().*
1cf50 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54  * and fsync(), T
1cf60 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20  ed tells us, is 
1cf70 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1cf80 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20   will not flush 
1cf90 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20  the.** inode if 
1cfa0 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e  the mtime or own
1cfb0 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64  er or other inod
1cfc0 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76  e attributes hav
1cfd0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65  e changed..** We
1cfe0 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
1cff0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1d000 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69  not the other fi
1d010 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73  le attributes, s
1d020 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53  o.** as far as S
1d030 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e  QLite is concern
1d040 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63  ed, an fdatasync
1d050 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65  () is always ade
1d060 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65  quate..** So, we
1d070 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74   always use fdat
1d080 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73  async() if it is
1d090 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61   available, rega
1d0a0 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65  rdless of.** the
1d0b0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
1d0c0 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a  taOnly flag..*/.
1d0d0 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f  static int full_
1d0e0 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e  fsync(int fd, in
1d0f0 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20  t fullSync, int 
1d100 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  dataOnly){.  int
1d110 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66   rc;..  /* The f
1d120 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f  ollowing "ifdef/
1d130 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63  elif/else/" bloc
1d140 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73  k has the same s
1d150 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a  tructure as.  **
1d160 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20   the one below. 
1d170 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64  It is replicated
1d180 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20   here solely to 
1d190 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67  avoid cluttering
1d1a0 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65   .  ** up the re
1d1b0 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65  al code with the
1d1c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d1d0 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f  R() macros..  */
1d1e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1d1f0 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  O_SYNC.  UNUSED_
1d200 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
1d210 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d220 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1d230 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1d240 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66  dataOnly);.#elif
1d250 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
1d260 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1d270 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
1d280 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
1d290 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1d2a0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1d2b0 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1d2c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63  #endif..  /* Rec
1d2d0 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
1d2e0 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20  f times that we 
1d2f0 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e  do a normal fsyn
1d300 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55  c() and .  ** FU
1d310 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73  LLSYNC.  This is
1d320 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
1d330 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ting to verify t
1d340 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75  hat this procedu
1d350 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c  re.  ** gets cal
1d360 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72  led with the cor
1d370 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a  rect arguments..
1d380 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1d390 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75  TE_TEST.  if( fu
1d3a0 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33  llSync ) sqlite3
1d3b0 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
1d3c0 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e  +;.  sqlite3_syn
1d3d0 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
1d3e0 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
1d3f0 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
1d400 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
1d410 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
1d420 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
1d430 70 2e 20 20 42 75 74 20 67 6f 20 61 68 65 61 64  p.  But go ahead
1d440 20 61 6e 64 20 63 61 6c 6c 20 66 73 74 61 74 28   and call fstat(
1d450 29 20 74 6f 20 76 61 6c 69 64 61 74 65 20 74 68  ) to validate th
1d460 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  e file.  ** desc
1d470 72 69 70 74 6f 72 20 61 73 20 77 65 20 6e 65 65  riptor as we nee
1d480 64 20 61 20 6d 65 74 68 6f 64 20 74 6f 20 70 72  d a method to pr
1d490 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75 72 65 20  ovoke a failure 
1d4a0 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63 6f 76 65  during.  ** cove
1d4b0 72 61 74 65 20 74 65 73 74 69 6e 67 2e 0a 20 20  rate testing..  
1d4c0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1d4d0 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a 20 20 20  _NO_SYNC.  {.   
1d4e0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1d4f0 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  ;.    rc = osFst
1d500 61 74 28 66 64 2c 20 26 62 75 66 29 3b 0a 20 20  at(fd, &buf);.  
1d510 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  }.#elif HAVE_FUL
1d520 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c  LFSYNC.  if( ful
1d530 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
1d540 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  = osFcntl(fd, F_
1d550 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20  FULLFSYNC, 0);. 
1d560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1d570 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20   1;.  }.  /* If 
1d580 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61  the FULLFSYNC fa
1d590 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20  iled, fall back 
1d5a0 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  to attempting an
1d5b0 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49   fsync()..  ** I
1d5c0 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70  t shouldn't be p
1d5d0 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c  ossible for full
1d5e0 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e  fsync to fail on
1d5f0 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a   the local .  **
1d600 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e   file system (on
1d610 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72   OSX), so failur
1d620 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
1d630 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20   FULLFSYNC.  ** 
1d640 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
1d650 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79  for this file sy
1d660 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70  stem. So, attemp
1d670 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a  t an fsync .  **
1d680 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69   and (for now) i
1d690 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65  gnore the overhe
1d6a0 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75  ad of a superflu
1d6b0 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20  ous fcntl call. 
1d6c0 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62   .  ** It'd be b
1d6d0 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20  etter to detect 
1d6e0 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72  fullfsync suppor
1d6f0 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64  t once and avoid
1d700 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c   .  ** the fcntl
1d710 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65   call every time
1d720 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e   sync is called.
1d730 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29  .  */.  if( rc )
1d740 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1d750 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ..#elif defined(
1d760 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20  __APPLE__).  /* 
1d770 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48  fdatasync() on H
1d780 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20  FS+ doesn't yet 
1d790 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20 73  flush the file s
1d7a0 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67 65  ize if it change
1d7b0 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1d7c0 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65   so currently we
1d7d0 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20   default to the 
1d7e0 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65 66  macro that redef
1d7f0 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20 74  ines fdatasync t
1d800 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72  o fsync.  */.  r
1d810 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23  c = fsync(fd);.#
1d820 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61  else .  rc = fda
1d830 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20  tasync(fd);.#if 
1d840 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
1d850 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f   rc==-1 && errno
1d860 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20  ==ENOTSUP ){.   
1d870 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1d880 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  .  }.#endif /* O
1d890 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e  S_VXWORKS */.#en
1d8a0 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
1d8b0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66  ITE_NO_SYNC elif
1d8c0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1d8d0 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57  */..  if( OS_VXW
1d8e0 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20  ORKS && rc!= -1 
1d8f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
1d900 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d910 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1d920 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1d930 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
1d940 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
1d950 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49   zFilename..** I
1d960 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
1d970 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Fd is set to the
1d980 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73   opened file des
1d990 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53  criptor and.** S
1d9a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d9b0 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
1d9c0 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72  r occurs, either
1d9d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
1d9e0 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   or SQLITE_CANTO
1d9f0 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20  PEN is returned 
1da00 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20  and *pFd is set 
1da10 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a  to an undefined.
1da20 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ** value..**.** 
1da30 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  The directory fi
1da40 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1da50 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f   used for only o
1da60 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a  ne thing - to.**
1da70 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65 63   fsync() a direc
1da80 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72  tory to make sur
1da90 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20  e file creation 
1daa0 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65  and deletion eve
1dab0 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68  nts.** are flush
1dac0 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63  ed to disk.  Suc
1dad0 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74  h fsyncs are not
1dae0 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72   needed on newer
1daf0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66  .** journaling f
1db00 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20  ilesystems, but 
1db10 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
1db20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d  older filesystem
1db30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1db40 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65  utine can be ove
1db50 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68  rridden using th
1db60 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e  e xSetSysCall in
1db70 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20  terface..** The 
1db80 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72  ability to overr
1db90 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ide this routine
1dba0 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73 75   was added in su
1dbb0 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  pport of the.** 
1dbc0 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78  chromium sandbox
1dbd0 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72  .  Opening a dir
1dbe0 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63 75  ectory is a secu
1dbf0 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61 72  rity risk (we ar
1dc00 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61  e.** told) so ma
1dc10 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65  king it override
1dc20 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20  able allows the 
1dc30 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78  chromium sandbox
1dc40 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74   to.** replace t
1dc50 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
1dc60 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
1dc70 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73  p.  To make this
1dc80 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f   routine.** a no
1dc90 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20  -op, replace it 
1dca0 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61 74  with a stub that
1dcb0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1dcc0 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a  OK but leaves.**
1dcd0 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e   *pFd set to a n
1dce0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a  egative number..
1dcf0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1dd00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
1dd10 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
1dd20 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c  sponsible for cl
1dd30 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c  osing.** the fil
1dd40 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46  e descriptor *pF
1dd50 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e  d using close().
1dd60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
1dd70 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
1dd80 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1dd90 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20  me, int *pFd){. 
1dda0 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66   int ii;.  int f
1ddb0 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a  d = -1;.  char z
1ddc0 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Dirname[MAX_PATH
1ddd0 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69  NAME+1];..  sqli
1dde0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
1ddf0 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e  _PATHNAME, zDirn
1de00 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ame, "%s", zFile
1de10 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  name);.  for(ii=
1de20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72  (int)strlen(zDir
1de30 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26 26 20 7a  name); ii>0 && z
1de40 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27  Dirname[ii]!='/'
1de50 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69  ; ii--);.  if( i
1de60 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e  i>0 ){.    zDirn
1de70 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a  ame[ii] = '\0';.
1de80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1de90 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21 3d 27 2f   zDirname[0]!='/
1dea0 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 20  ' ) zDirname[0] 
1deb0 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44 69 72 6e  = '.';.    zDirn
1dec0 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20 20 7d 0a  ame[1] = 0;.  }.
1ded0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
1dee0 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
1def0 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
1df00 30 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20  0);.  if( fd>=0 
1df10 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
1df20 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
1df30 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
1df40 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 46 64 20  e));.  }.  *pFd 
1df50 3d 20 66 64 3b 0a 20 20 69 66 28 20 66 64 3e 3d  = fd;.  if( fd>=
1df60 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1df70 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 75  E_OK;.  return u
1df80 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1df90 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1dfa0 2c 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  , "openDirectory
1dfb0 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 7d 0a  ", zDirname);.}.
1dfc0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1dfd0 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
1dfe0 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
1dff0 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
1e000 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
1e010 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
1e020 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
1e030 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
1e040 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
1e050 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
1e060 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
1e070 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
1e080 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
1e090 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
1e0a0 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
1e0b0 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
1e0c0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1e0d0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
1e0e0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
1e0f0 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
1e100 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
1e110 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
1e120 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
1e130 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
1e140 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
1e150 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
1e160 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
1e170 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
1e180 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
1e190 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1e1a0 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
1e1b0 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
1e1c0 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
1e1d0 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
1e1e0 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
1e1f0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1e200 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
1e210 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
1e220 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
1e230 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
1e240 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
1e250 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
1e260 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
1e270 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
1e280 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
1e290 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1e2a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1e2b0 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
1e2c0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
1e2d0 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
1e2e0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1e2f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1e300 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
1e310 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
1e320 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
1e330 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
1e340 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
1e350 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1e360 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
1e370 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
1e380 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
1e390 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
1e3a0 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
1e3b0 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
1e3c0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
1e3d0 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
1e3e0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1e3f0 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
1e400 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
1e410 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
1e420 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
1e430 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
1e440 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
1e450 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
1e460 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
1e470 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
1e480 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
1e490 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1e4a0 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
1e4b0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
1e4c0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
1e4d0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ;.  OSTRACE(("SY
1e4e0 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
1e4f0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20  File->h));.  rc 
1e500 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
1e510 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
1e520 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
1e530 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1e540 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1e550 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
1e560 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1e570 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
1e580 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1e590 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
1e5a0 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63  YNC, "full_fsync
1e5b0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1e5c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ;.  }..  /* Also
1e5d0 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63   fsync the direc
1e5e0 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1e5f0 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20  the file if the 
1e600 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a  DIRSYNC flag.  *
1e610 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20  * is set.  This 
1e620 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63  is a one-time oc
1e630 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20  currence.  Many 
1e640 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65  systems (example
1e650 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65  s: AIX).  ** are
1e660 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63   unable to fsync
1e670 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f   a directory, so
1e680 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f   ignore errors o
1e690 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a  n the fsync..  *
1e6a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  /.  if( pFile->c
1e6b0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
1e6c0 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20  ILE_DIRSYNC ){. 
1e6d0 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20     int dirfd;.  
1e6e0 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53    OSTRACE(("DIRS
1e6f0 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c  YNC %s (have_ful
1e700 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
1e710 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
1e720 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20  ->zPath,.       
1e730 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
1e740 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
1e750 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  );.    rc = osOp
1e760 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c  enDirectory(pFil
1e770 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64  e->zPath, &dirfd
1e780 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1e790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e7a0 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72    full_fsync(dir
1e7b0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
1e7c0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1e7d0 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49  ile, dirfd, __LI
1e7e0 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
1e7f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e800 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
1e810 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63 20  PEN );.      rc 
1e820 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1e830 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74   }.    pFile->ct
1e840 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58  rlFlags &= ~UNIX
1e850 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20  FILE_DIRSYNC;.  
1e860 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e870 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
1e880 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
1e890 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
1e8a0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1e8b0 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c  unixTruncate(sql
1e8c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1e8d0 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69  64 nByte){.  uni
1e8e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1e8f0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
1e900 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
1e910 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
1e920 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1e930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e940 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a  RR_TRUNCATE );..
1e950 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
1e960 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
1e970 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
1e980 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
1e990 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
1e9a0 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
1e9b0 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
1e9c0 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
1e9d0 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
1e9e0 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
1e9f0 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
1ea00 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
1ea10 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1ea20 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
1ea30 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
1ea40 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1ea50 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
1ea60 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
1ea70 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
1ea80 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
1ea90 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
1eaa0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f  ;.  }..  rc = ro
1eab0 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1eac0 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 3b  File->h, nByte);
1ead0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1eae0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1eaf0 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
1eb00 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1eb10 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1eb20 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1eb30 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1eb40 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
1eb50 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
1eb60 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66  _DEBUG.    /* If
1eb70 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1eb80 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1eb90 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1eba0 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1ebb0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f     ** doing a ho
1ebc0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1ebd0 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
1ebe0 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
1ebf0 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e   than a.    ** n
1ec00 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1ec10 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e  ile) and we trun
1ec20 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1ec30 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20   zero length,.  
1ec40 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74    ** that effect
1ec50 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74 68  ively updates th
1ec60 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1ec70 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  .  This might ha
1ec80 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e  ppen.    ** when
1ec90 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74   restoring a dat
1eca0 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1ecb0 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20  backup API from 
1ecc0 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20  a zero-length.  
1ecd0 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20    ** source..   
1ece0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c   */.    if( pFil
1ecf0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1ed00 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a   && nByte==0 ){.
1ed10 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1ed20 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a  nsCntrChng = 1;.
1ed30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69      }.#endif..#i
1ed40 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1ed50 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20  P_SIZE>0.    /* 
1ed60 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
1ed70 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20 74  just truncated t
1ed80 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72  o a size smaller
1ed90 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
1eda0 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65  tly.    ** mappe
1edb0 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65  d region, reduce
1edc0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 6d   the effective m
1edd0 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77  apping size as w
1ede0 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c  ell. SQLite will
1edf0 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61 64  .    ** use read
1ee00 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74  () and write() t
1ee10 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65  o access data be
1ee20 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20  yond this point 
1ee30 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20  from now on.  . 
1ee40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42     */.    if( nB
1ee50 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte<pFile->mmapS
1ee60 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ize ){.      pFi
1ee70 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e  le->mmapSize = n
1ee80 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Byte;.    }.#end
1ee90 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  if..    return S
1eea0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
1eeb0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
1eec0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1eed0 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
1eee0 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
1eef0 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
1ef00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1ef10 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1ef20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
1ef30 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
1ef40 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
1ef50 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69   = osFstat(((uni
1ef60 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
1ef70 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
1ef80 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
1ef90 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
1efa0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1efb0 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
1efc0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
1efd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1efe0 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a  R_FSTAT;.  }.  *
1eff0 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73  pSize = buf.st_s
1f000 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  ize;..  /* When 
1f010 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73  opening a zero-s
1f020 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ize database, th
1f030 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  e findInodeInfo(
1f040 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  ) procedure.  **
1f050 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65   writes a single
1f060 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20   byte into that 
1f070 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
1f080 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62   work around a b
1f090 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f  ug.  ** in the O
1f0a0 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79  S-X msdos filesy
1f0b0 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20  stem.  In order 
1f0c0 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
1f0d0 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a  s with upper.  *
1f0e0 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65  * layers, we nee
1f0f0 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73  d to report this
1f100 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65   file size as ze
1f110 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  ro even though i
1f120 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79  t is.  ** really
1f130 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32   1.   Ticket #32
1f140 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a  60..  */.  if( *
1f150 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a  pSize==1 ) *pSiz
1f160 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72  e = 0;...  retur
1f170 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f180 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1f190 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1f1a0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1f1b0 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  LE__)./*.** Hand
1f1c0 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f  ler for proxy-lo
1f1d0 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72  cking file-contr
1f1e0 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e  ol verbs.  Defin
1f1f0 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a  ed below in the.
1f200 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b  ** proxying lock
1f210 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  ing division..*/
1f220 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
1f230 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
1f240 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
1f250 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  oid*);.#endif../
1f260 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
1f270 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1f280 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49   handle the SQLI
1f290 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1f2a0 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74  NT .** file-cont
1f2b0 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  rol operation.  
1f2c0 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61 74 61  Enlarge the data
1f2d0 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69  base to nBytes i
1f2e0 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64  n size.** (round
1f2f0 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78  ed up to the nex
1f300 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20  t chunk-size).  
1f310 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1f320 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42  is already.** nB
1f330 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20  ytes or larger, 
1f340 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1f350 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1f360 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65  ic int fcntlSize
1f370 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70  Hint(unixFile *p
1f380 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29  File, i64 nByte)
1f390 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  {.  if( pFile->s
1f3a0 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
1f3b0 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  i64 nSize;      
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f3d0 20 52 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   Required file s
1f3e0 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
1f3f0 74 20 73 74 61 74 20 62 75 66 3b 20 20 20 20 20  t stat buf;     
1f400 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
1f410 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20   to hold return 
1f420 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28  values of fstat(
1f430 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28  ) */.   .    if(
1f440 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
1f450 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20  h, &buf) ){.    
1f460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f470 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
1f480 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   }..    nSize = 
1f490 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73  ((nByte+pFile->s
1f4a0 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c  zChunk-1) / pFil
1f4b0 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1f4c0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1f4d0 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34    if( nSize>(i64
1f4e0 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a  )buf.st_size ){.
1f4f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
1f500 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
1f510 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
1f520 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20  _FALLOCATE.     
1f530 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c   /* The code bel
1f540 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74  ow is handling t
1f550 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1f560 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29  of osFallocate()
1f570 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65   .      ** corre
1f580 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c  ctly. posix_fall
1f590 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69 6e  ocate() is defin
1f5a0 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a  ed to "returns z
1f5b0 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
1f5c0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20  .      ** or an 
1f5d0 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20  error number on 
1f5e0 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74   failure". See t
1f5f0 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64  he manpage for d
1f600 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1f610 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20   int err;.      
1f620 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20  do{.        err 
1f630 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46  = osFallocate(pF
1f640 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73  ile->h, buf.st_s
1f650 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73  ize, nSize-buf.s
1f660 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  t_size);.      }
1f670 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54  while( err==EINT
1f680 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  R );.      if( e
1f690 72 72 20 26 26 20 65 72 72 21 3d 45 49 4e 56 41  rr && err!=EINVA
1f6a0 4c 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  L ) return SQLIT
1f6b0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23  E_IOERR_WRITE;.#
1f6c0 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66  else.      /* If
1f6d0 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74   the OS does not
1f6e0 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c   have posix_fall
1f6f0 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74  ocate(), fake it
1f700 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20 20 20  . Write a .     
1f710 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
1f720 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  to the last byte
1f730 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 74   in each block t
1f740 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69 72 65  hat falls entire
1f750 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  ly.      ** with
1f760 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64 20  in the extended 
1f770 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66  region. Then, if
1f780 20 72 65 71 75 69 72 65 64 2c 20 61 20 73 69 6e   required, a sin
1f790 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20 20 2a  gle byte.      *
1f7a0 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e 53 69  * at offset (nSi
1f7b0 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20 74 68  ze-1), to set th
1f7c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
1f7d0 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  le correctly..  
1f7e0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
1f7f0 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e 69 71   similar techniq
1f800 75 65 20 74 6f 20 74 68 61 74 20 75 73 65 64 20  ue to that used 
1f810 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79 73 74  by glibc on syst
1f820 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ems.      ** tha
1f830 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20  t do not have a 
1f840 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29  real fallocate()
1f850 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a   call..      */.
1f860 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d        int nBlk =
1f870 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b   buf.st_blksize;
1f880 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d    /* File-system
1f890 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20   block size */. 
1f8a0 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20       int nWrite 
1f8b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f8c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1f8d0 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 73  tes written by s
1f8e0 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1f8f0 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b       i64 iWrite;
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20   /* Next offset 
1f920 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a  to write to */..
1f930 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20 28        iWrite = (
1f940 62 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c 6b  buf.st_size/nBlk
1f950 29 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d 20  )*nBlk + nBlk - 
1f960 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
1f970 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74 5f   iWrite>=buf.st_
1f980 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  size );.      as
1f990 73 65 72 74 28 20 28 28 69 57 72 69 74 65 2b 31  sert( ((iWrite+1
1f9a0 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20  )%nBlk)==0 );.  
1f9b0 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a      for(/*no-op*
1f9c0 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 2b  /; iWrite<nSize+
1f9d0 6e 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65 2b 3d  nBlk-1; iWrite+=
1f9e0 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  nBlk ){.        
1f9f0 69 66 28 20 69 57 72 69 74 65 3e 3d 6e 53 69 7a  if( iWrite>=nSiz
1fa00 65 20 29 20 69 57 72 69 74 65 20 3d 20 6e 53 69  e ) iWrite = nSi
1fa10 7a 65 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ze - 1;.        
1fa20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64  nWrite = seekAnd
1fa30 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72  Write(pFile, iWr
1fa40 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20  ite, "", 1);.   
1fa50 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21       if( nWrite!
1fa60 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
1fa70 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1fa80 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1fa90 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51     }.  }..#if SQ
1faa0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1fab0 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65  ZE>0.  if( pFile
1fac0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
1fad0 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e  && nByte>pFile->
1fae0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1faf0 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20  int rc;.    if( 
1fb00 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d  pFile->szChunk<=
1fb10 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  0 ){.      if( r
1fb20 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1fb30 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
1fb40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
1fb50 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1fb60 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
1fb70 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1fb80 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1fb90 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
1fba0 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
1fbb0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
1fbc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1fbd0 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
1fbe0 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  le, nByte);.    
1fbf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
1fc00 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1fc10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1fc20 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
1fc30 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69  initially negati
1fc40 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ve then this is 
1fc50 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70  a query.  Set *p
1fc60 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30  Arg to.** 1 or 0
1fc70 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1fc80 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74  ether or not bit
1fc90 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e   mask of pFile->
1fca0 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74  ctrlFlags is set
1fcb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ..**.** If *pArg
1fcc0 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   is 0 or 1, then
1fcd0 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68   clear or set th
1fce0 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46  e mask bit of pF
1fcf0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a  ile->ctrlFlags..
1fd00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1fd10 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46  nixModeBit(unixF
1fd20 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
1fd30 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
1fd40 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
1fd50 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
1fd60 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
1fd70 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
1fd80 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
1fd90 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
1fda0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
1fdb0 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
1fdc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
1fdd0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
1fde0 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
1fdf0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
1fe00 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
1fe10 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
1fe20 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
1fe30 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a  r *zBuf);../*.**
1fe40 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64   Information and
1fe50 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f   control of an o
1fe60 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
1fe70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1fe80 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  nixFileControl(s
1fe90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1fea0 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
1feb0 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  Arg){.  unixFile
1fec0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1fed0 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63  ile*)id;.  switc
1fee0 68 28 20 6f 70 20 29 7b 0a 23 69 66 20 64 65 66  h( op ){.#if def
1fef0 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
1ff00 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
1ff10 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
1ff20 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 20  TOMIC_WRITE).   
1ff30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1ff40 54 4c 5f 42 45 47 49 4e 5f 41 54 4f 4d 49 43 5f  TL_BEGIN_ATOMIC_
1ff50 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 69  WRITE: {.      i
1ff60 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28  nt rc = osIoctl(
1ff70 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49  pFile->h, F2FS_I
1ff80 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49 43 5f  OC_START_ATOMIC_
1ff90 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65  WRITE);.      re
1ffa0 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45  turn rc ? SQLITE
1ffb0 5f 49 4f 45 52 52 5f 42 45 47 49 4e 5f 41 54 4f  _IOERR_BEGIN_ATO
1ffc0 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b  MIC : SQLITE_OK;
1ffd0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ffe0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d  SQLITE_FCNTL_COM
1fff0 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  MIT_ATOMIC_WRITE
20000 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
20010 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65   = osIoctl(pFile
20020 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 43 4f  ->h, F2FS_IOC_CO
20030 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54  MMIT_ATOMIC_WRIT
20040 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
20050 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45   rc ? SQLITE_IOE
20060 52 52 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43  RR_COMMIT_ATOMIC
20070 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   : SQLITE_OK;.  
20080 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
20090 49 54 45 5f 46 43 4e 54 4c 5f 52 4f 4c 4c 42 41  ITE_FCNTL_ROLLBA
200a0 43 4b 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a  CK_ATOMIC_WRITE:
200b0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20   {.      int rc 
200c0 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d  = osIoctl(pFile-
200d0 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 41 42 4f  >h, F2FS_IOC_ABO
200e0 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54  RT_VOLATILE_WRIT
200f0 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
20100 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45   rc ? SQLITE_IOE
20110 52 52 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d  RR_ROLLBACK_ATOM
20120 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  IC : SQLITE_OK;.
20130 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
20140 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53 51 4c  __linux__ && SQL
20150 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
20160 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 2a 2f  _ATOMIC_WRITE */
20170 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
20180 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
20190 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
201a0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
201b0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
201c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
201d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
201e0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
201f0 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
20200 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
20210 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
20220 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
20230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
20240 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20250 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a  _FCNTL_CHUNK_SIZ
20260 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  E: {.      pFile
20270 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e  ->szChunk = *(in
20280 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  t *)pArg;.      
20290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
202a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
202b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
202c0 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
202d0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53   int rc;.      S
202e0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
202f0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
20300 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  c = fcntlSizeHin
20310 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a  t(pFile, *(i64 *
20320 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69  )pArg);.      Si
20330 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
20340 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65  ign(0);.      re
20350 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
20360 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
20370 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
20380 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f  : {.      unixMo
20390 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49  deBit(pFile, UNI
203a0 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
203b0 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  L, (int*)pArg);.
203c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
203d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
203e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
203f0 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
20400 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
20410 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
20420 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f  le, UNIXFILE_PSO
20430 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  W, (int*)pArg);.
20440 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20450 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
20460 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
20470 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20  NTL_VFSNAME: {. 
20480 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
20490 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rg = sqlite3_mpr
204a0 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65  intf("%s", pFile
204b0 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pVfs->zName);.
204c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
204d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
204e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
204f0 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
20500 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  : {.      char *
20510 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  zTFile = sqlite3
20520 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69 6c 65  _malloc64( pFile
20530 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
20540 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me );.      if( 
20550 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  zTFile ){.      
20560 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d    unixGetTempnam
20570 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  e(pFile->pVfs->m
20580 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c  xPathname, zTFil
20590 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68  e);.        *(ch
205a0 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69  ar**)pArg = zTFi
205b0 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
205c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
205d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
205e0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
205f0 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20  HAS_MOVED: {.   
20600 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
20610 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46   fileHasMoved(pF
20620 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ile);.      retu
20630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
20640 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
20650 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54  E_ENABLE_SETLK_T
20660 49 4d 45 4f 55 54 0a 20 20 20 20 63 61 73 65 20  IMEOUT.    case 
20670 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
20680 4b 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20  K_TIMEOUT: {.   
20690 20 20 20 70 46 69 6c 65 2d 3e 69 42 75 73 79 54     pFile->iBusyT
206a0 69 6d 65 6f 75 74 20 3d 20 2a 28 69 6e 74 2a 29  imeout = *(int*)
206b0 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75  pArg;.      retu
206c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
206d0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53    }.#endif.#if S
206e0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
206f0 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53  IZE>0.    case S
20700 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
20710 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69  _SIZE: {.      i
20720 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28  64 newLimit = *(
20730 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  i64*)pArg;.     
20740 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20750 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  _OK;.      if( n
20760 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47  ewLimit>sqlite3G
20770 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
20780 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  ap ){.        ne
20790 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  wLimit = sqlite3
207a0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
207b0 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  map;.      }..  
207c0 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
207d0 20 6f 66 20 6e 65 77 4c 69 6d 69 74 20 6d 61 79   of newLimit may
207e0 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 63   be eventually c
207f0 61 73 74 20 74 6f 20 28 73 69 7a 65 5f 74 29 20  ast to (size_t) 
20800 61 6e 64 20 70 61 73 73 65 64 0a 20 20 20 20 20  and passed.     
20810 20 2a 2a 20 74 6f 20 6d 6d 61 70 28 29 2e 20 52   ** to mmap(). R
20820 65 73 74 72 69 63 74 20 69 74 73 20 76 61 6c 75  estrict its valu
20830 65 20 74 6f 20 32 47 42 20 69 66 20 28 73 69 7a  e to 2GB if (siz
20840 65 5f 74 29 20 69 73 20 6e 6f 74 20 61 74 20 6c  e_t) is not at l
20850 65 61 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  east a.      ** 
20860 36 34 2d 62 69 74 20 74 79 70 65 2e 20 2a 2f 0a  64-bit type. */.
20870 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
20880 69 74 3e 30 20 26 26 20 73 69 7a 65 6f 66 28 73  it>0 && sizeof(s
20890 69 7a 65 5f 74 29 3c 38 20 29 7b 0a 20 20 20 20  ize_t)<8 ){.    
208a0 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 28      newLimit = (
208b0 6e 65 77 4c 69 6d 69 74 20 26 20 30 78 37 46 46  newLimit & 0x7FF
208c0 46 46 46 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a  FFFFF);.      }.
208d0 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41  .      *(i64*)pA
208e0 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  rg = pFile->mmap
208f0 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69  SizeMax;.      i
20900 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26  f( newLimit>=0 &
20910 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c  & newLimit!=pFil
20920 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26  e->mmapSizeMax &
20930 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f  & pFile->nFetchO
20940 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
20950 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
20960 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a  Max = newLimit;.
20970 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
20980 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  e->mmapSize>0 ){
20990 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55  .          unixU
209a0 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
209b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
209c0 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c  unixMapfile(pFil
209d0 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  e, -1);.        
209e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
209f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20a00 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
20a10 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
20a20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c  /* The pager cal
20a30 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  ls this method t
20a40 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74  o signal that it
20a50 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a   has done.    **
20a60 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20   a rollback and 
20a70 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
20a80 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75  e is therefore u
20a90 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20  nchanged and.   
20aa0 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20   ** it hence it 
20ab0 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72  is OK for the tr
20ac0 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65  ansaction change
20ad0 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20   counter to be. 
20ae0 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e     ** unchanged.
20af0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
20b00 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
20b10 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20  _UNCHANGED: {.  
20b20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
20b30 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  id)->dbUpdate = 
20b40 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
20b50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
20b60 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
20b70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
20b80 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
20b90 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
20ba0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
20bb0 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
20bc0 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  YFILE:.    case 
20bd0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54  SQLITE_FCNTL_GET
20be0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
20bf0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
20c00 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  roxyFileControl(
20c10 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20  id,op,pArg);.   
20c20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
20c30 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
20c40 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
20c50 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
20c60 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  /.  }.  return S
20c70 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
20c80 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 64 2d  }../*.** If pFd-
20c90 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 6e  >sectorSize is n
20ca0 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74 68 69  on-zero when thi
20cb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
20cc0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a 2a 2a  lled, it is a.**
20cd0 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
20ce0 65 2c 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  e, the values of
20cf0 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65   pFd->sectorSize
20d00 20 61 6e 64 20 0a 2a 2a 20 70 46 64 2d 3e 64 65   and .** pFd->de
20d10 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20d20 69 63 73 20 61 72 65 20 73 65 74 20 61 63 63 6f  ics are set acco
20d30 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c  rding to the fil
20d40 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 63 68 61  e-system .** cha
20d50 72 61 63 74 65 72 69 73 74 69 63 73 2e 20 0a 2a  racteristics. .*
20d60 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
20d70 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
20d80 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 6e  his function. On
20d90 65 20 66 6f 72 20 51 4e 58 20 61 6e 64 20 6f 6e  e for QNX and on
20da0 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6f 74 68  e for all.** oth
20db0 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  er systems..*/.#
20dc0 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  ifndef __QNXNTO_
20dd0 5f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  _.static void se
20de0 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  tDeviceCharacter
20df0 69 73 74 69 63 73 28 75 6e 69 78 46 69 6c 65 20  istics(unixFile 
20e00 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74 28  *pFd){.  assert(
20e10 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72   pFd->deviceChar
20e20 61 63 74 65 72 69 73 74 69 63 73 3d 3d 30 20 7c  acteristics==0 |
20e30 7c 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  | pFd->sectorSiz
20e40 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  e!=0 );.  if( pF
20e50 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30  d->sectorSize==0
20e60 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
20e70 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
20e80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
20e90 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
20ea0 5f 57 52 49 54 45 29 0a 20 20 20 20 69 6e 74 20  _WRITE).    int 
20eb0 72 65 73 3b 0a 20 20 20 20 75 33 32 20 66 20 3d  res;.    u32 f =
20ec0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   0;..    /* Chec
20ed0 6b 20 66 6f 72 20 73 75 70 70 6f 72 74 20 66 6f  k for support fo
20ee0 72 20 46 32 46 53 20 61 74 6f 6d 69 63 20 62 61  r F2FS atomic ba
20ef0 74 63 68 20 77 72 69 74 65 73 2e 20 2a 2f 0a 20  tch writes. */. 
20f00 20 20 20 72 65 73 20 3d 20 6f 73 49 6f 63 74 6c     res = osIoctl
20f10 28 70 46 64 2d 3e 68 2c 20 46 32 46 53 5f 49 4f  (pFd->h, F2FS_IO
20f20 43 5f 47 45 54 5f 46 45 41 54 55 52 45 53 2c 20  C_GET_FEATURES, 
20f30 26 66 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  &f);.    if( res
20f40 3d 3d 30 20 26 26 20 28 66 20 26 20 46 32 46 53  ==0 && (f & F2FS
20f50 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d 49 43 5f  _FEATURE_ATOMIC_
20f60 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
20f70 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61  pFd->deviceChara
20f80 63 74 65 72 69 73 74 69 63 73 20 3d 20 53 51 4c  cteristics = SQL
20f90 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f  ITE_IOCAP_BATCH_
20fa0 41 54 4f 4d 49 43 3b 0a 20 20 20 20 7d 0a 23 65  ATOMIC;.    }.#e
20fb0 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f  ndif /* __linux_
20fc0 5f 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  _ && SQLITE_ENAB
20fd0 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f  LE_BATCH_ATOMIC_
20fe0 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20 2f 2a  WRITE */..    /*
20ff0 20 53 65 74 20 74 68 65 20 50 4f 57 45 52 53 41   Set the POWERSA
21000 46 45 5f 4f 56 45 52 57 52 49 54 45 20 66 6c 61  FE_OVERWRITE fla
21010 67 20 69 66 20 72 65 71 75 65 73 74 65 64 2e 20  g if requested. 
21020 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  */.    if( pFd->
21030 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
21040 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20  FILE_PSOW ){.   
21050 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68     pFd->deviceCh
21060 61 72 61 63 74 65 72 69 73 74 69 63 73 20 7c 3d  aracteristics |=
21070 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
21080 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
21090 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46  E;.    }..    pF
210a0 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  d->sectorSize = 
210b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
210c0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
210d0 7d 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65  }.#else.#include
210e0 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68   <sys/dcmd_blk.h
210f0 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
21100 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61 74 69  statvfs.h>.stati
21110 63 20 76 6f 69 64 20 73 65 74 44 65 76 69 63 65  c void setDevice
21120 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
21130 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
21140 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  {.  if( pFile->s
21150 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29  ectorSize == 0 )
21160 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
21170 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  tvfs fsInfo;.   
21180 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20      .    /* Set 
21190 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e  defaults for non
211a0 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73  -supported files
211b0 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46  ystems */.    pF
211c0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
211d0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
211e0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
211f0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
21200 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
21210 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61   0;.    if( fsta
21220 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26  tvfs(pFile->h, &
21230 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  fsInfo) == -1 ) 
21240 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
21250 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
21260 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
21270 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29  basetype, "tmp")
21280 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
21290 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
212a0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
212b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
212c0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
212d0 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49  s =.        SQLI
212e0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34  TE_IOCAP_ATOMIC4
212f0 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  K |       /* All
21300 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
21310 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
21320 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
21330 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
21340 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
21350 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
21360 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
21370 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
213a0 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
213b0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
213c0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
213d0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
213e0 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
213f0 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
21400 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
21430 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
21440 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
21450 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28  else if( strstr(
21460 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
21470 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20  e, "etfs") ){.  
21480 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
21490 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
214a0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
214b0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
214c0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
214d0 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75       /* etfs clu
214e0 73 74 65 72 20 73 69 7a 65 20 77 72 69 74 65 73  ster size writes
214f0 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
21500 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73         (pFile->s
21510 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
21520 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
21530 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20  TOMIC512) |.    
21540 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
21550 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
21560 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
21570 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
21580 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215b0 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
215c0 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
215d0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
215e0 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
215f0 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
21600 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
21610 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
21650 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
21660 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
21670 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
21680 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36  _basetype, "qnx6
21690 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
216a0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
216b0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
216c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
216d0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
216e0 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
216f0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
21700 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c   |         /* Al
21710 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69  l filesystem wri
21720 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
21730 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
21740 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
21750 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
21760 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
21770 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
21780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
217b0 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
217c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
217d0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
217e0 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
217f0 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
21800 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
21840 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
21850 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
21860 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73  e if( !strcmp(fs
21870 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
21880 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20   "qnx4") ){.    
21890 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
218a0 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
218b0 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
218c0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
218d0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
218e0 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65     /* full bitse
218f0 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f  t of atomics fro
21900 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a  m max sector siz
21910 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f  e and smaller */
21920 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65  .        ((pFile
21930 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
21940 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
21950 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20  P_ATOMIC512) << 
21960 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20  1) - 2 |.       
21970 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
21980 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
21990 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
219a0 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
219b0 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
219e0 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
219f0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
21a00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
21a10 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62  trstr(fsInfo.f_b
21a20 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20  asetype, "dos") 
21a30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
21a40 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
21a50 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
21a60 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
21a70 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
21a80 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c  =.        /* ful
21a90 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d  l bitset of atom
21aa0 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63  ics from max sec
21ab0 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61  tor size and sma
21ac0 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ller */.        
21ad0 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  ((pFile->sectorS
21ae0 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49  ize / 512 * SQLI
21af0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
21b00 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a  12) << 1) - 2 |.
21b10 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
21b20 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
21b30 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
21b40 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
21b50 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b80 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
21b90 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
21ba0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
21bb0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
21bc0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
21bd0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
21be0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
21bf0 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a  MIC512 |      /*
21c00 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d   blocks are atom
21c10 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
21c20 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
21c30 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
21c40 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
21c50 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
21c60 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
21c90 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
21ca0 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
21cb0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61     }.  }.  /* La
21cc0 73 74 20 63 68 61 6e 63 65 20 76 65 72 69 66 69  st chance verifi
21cd0 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  cation.  If the 
21ce0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27  sector size isn'
21cf0 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  t a multiple of 
21d00 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74  512.  ** then it
21d10 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a   isn't valid.*/.
21d20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63    if( pFile->sec
21d30 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d  torSize % 512 !=
21d40 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d   0 ){.    pFile-
21d50 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
21d60 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20  istics = 0;.    
21d70 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
21d80 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
21d90 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
21da0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
21db0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
21dc0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
21dd0 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
21de0 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
21df0 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
21e00 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
21e10 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
21e20 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
21e30 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
21e40 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
21e50 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
21e60 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
21e70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
21e80 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
21e90 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
21ea0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
21eb0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
21ec0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
21ed0 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
21ee0 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
21ef0 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
21f00 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
21f10 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
21f20 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
21f30 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
21f40 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
21f50 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
21f60 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
21f70 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e  xFile *pFd = (un
21f80 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
21f90 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  tDeviceCharacter
21fa0 69 73 74 69 63 73 28 70 46 64 29 3b 0a 20 20 72  istics(pFd);.  r
21fb0 65 74 75 72 6e 20 70 46 64 2d 3e 73 65 63 74 6f  eturn pFd->secto
21fc0 72 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rSize;.}../*.** 
21fd0 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63  Return the devic
21fe0 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
21ff0 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  s for the file..
22000 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69  **.** This VFS i
22010 73 20 73 65 74 20 75 70 20 74 6f 20 72 65 74 75  s set up to retu
22020 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
22030 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
22040 49 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a  ITE by default..
22050 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  ** However, that
22060 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72   choice is contr
22070 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74  oversial since t
22080 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75  echnically the u
22090 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c  nderlying.** fil
220a0 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f  e system does no
220b0 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65  t always provide
220c0 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77   powersafe overw
220d0 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65  rites.  (In othe
220e0 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65  r.** words, afte
220f0 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65  r a power-loss e
22100 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74  vent, parts of t
22110 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 72  he file that wer
22120 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74  e never.** writt
22130 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  en might end up 
22140 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20  being altered.) 
22150 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53   However, non-PS
22160 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73 20 76  OW behavior is v
22170 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72  ery,.** very rar
22180 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e  e.  And assertin
22190 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c  g PSOW makes a l
221a0 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69  arge reduction i
221b0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  n the amount.** 
221c0 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20  of required I/O 
221d0 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20  for journaling, 
221e0 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70  since a lot of p
221f0 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e  adding is elimin
22200 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c  ated..**  Hence,
22210 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45   while POWERSAFE
22220 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e  _OVERWRITE is on
22230 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65   by default, the
22240 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e  re is a file-con
22250 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  trol.** availabl
22260 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66  e to turn it off
22270 20 61 6e 64 20 55 52 49 20 71 75 65 72 79 20 70   and URI query p
22280 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62  arameter availab
22290 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66  le to turn it of
222a0 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
222b0 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
222c0 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
222d0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
222e0 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20  unixFile *pFd = 
222f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
22300 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63   setDeviceCharac
22310 74 65 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a  teristics(pFd);.
22320 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 64 65    return pFd->de
22330 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
22340 69 63 73 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  ics;.}..#if !def
22350 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
22360 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
22370 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
22380 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22390 65 20 73 79 73 74 65 6d 20 70 61 67 65 20 73 69  e system page si
223a0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ze..**.** This f
223b0 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e  unction should n
223c0 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64 69 72  ot be called dir
223d0 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72 20 63  ectly by other c
223e0 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
223f0 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69  . .** Instead, i
22400 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  t should be call
22410 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f 73 47  ed via macro osG
22420 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a 2f  etpagesize()..*/
22430 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
22440 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64  Getpagesize(void
22450 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
22460 53 0a 20 20 72 65 74 75 72 6e 20 31 30 32 34 3b  S.  return 1024;
22470 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
22480 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72 65  BSD_SOURCE).  re
22490 74 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a 65  turn getpagesize
224a0 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ();.#else.  retu
224b0 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66 28  rn (int)sysconf(
224c0 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a 23  _SC_PAGESIZE);.#
224d0 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66 20  endif.}..#endif 
224e0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
224f0 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
22500 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
22510 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e 64  SIZE>0 */..#ifnd
22520 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
22530 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  AL../*.** Object
22540 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
22550 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d  nt an shared mem
22560 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a  ory buffer.  .**
22570 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c  .** When multipl
22580 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65  e threads all re
22590 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65  ference the same
225a0 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68   wal-index, each
225b0 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69   thread.** has i
225c0 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f  ts own unixShm o
225d0 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20  bject, but they 
225e0 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73  all point to a s
225f0 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a  ingle instance.*
22600 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68  * of this unixSh
22610 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49  mNode object.  I
22620 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
22630 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73  ach wal-index is
22640 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20   opened.** only 
22650 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73  once per process
22660 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69  ..**.** Each uni
22670 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
22680 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  is connected to 
22690 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f  a single unixIno
226a0 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
226b0 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65  * We could coale
226c0 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  sce this object 
226d0 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e  into unixInodeIn
226e0 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75  fo, but that wou
226f0 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79  ld mean.** every
22700 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20   open file that 
22710 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61  does not use sha
22720 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f  red memory (in o
22730 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74  ther words, most
22740 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20  .** open files) 
22750 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61  would have to ca
22760 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20  rry around this 
22770 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
22780 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e  n.  So.** the un
22790 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
227a0 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ct contains a po
227b0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e  inter to this un
227c0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
227d0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78  .** and the unix
227e0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
227f0 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77  s created only w
22800 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a  hen needed..**.*
22810 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  * unixMutexHeld(
22820 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
22830 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20  hen creating or 
22840 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68  destroying.** th
22850 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69  is object or whi
22860 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
22870 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  iting the follow
22880 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a  ing fields:.**.*
22890 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a  *      nRef.**.*
228a0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
228b0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d  fields are read-
228c0 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f  only after the o
228d0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
228e0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 68 53  :.** .**      hS
228f0 68 6d 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  hm.**      zFile
22900 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
22910 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 70 53  r unixShmNode.pS
22920 68 6d 4d 75 74 65 78 20 6d 75 73 74 20 62 65 20  hmMutex must be 
22930 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e  held or unixShmN
22940 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
22950 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
22960 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
22970 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
22980 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
22990 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
229a0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
229b0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b  ct unixShmNode {
229c0 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
229d0 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a   *pInode;     /*
229e0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74   unixInodeInfo t
229f0 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48  hat owns this SH
22a00 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  M node */.  sqli
22a10 74 65 33 5f 6d 75 74 65 78 20 2a 70 53 68 6d 4d  te3_mutex *pShmM
22a20 75 74 65 78 3b 20 20 2f 2a 20 4d 75 74 65 78 20  utex;  /* Mutex 
22a30 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
22a40 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
22a50 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
22a60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
22a70 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c   the mmapped fil
22a80 65 20 2a 2f 0a 20 20 69 6e 74 20 68 53 68 6d 3b  e */.  int hShm;
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22aa0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
22ab0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
22ac0 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
22ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
22ae0 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
22af0 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
22b00 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  u16 nRegion;    
22b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
22b20 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
22b30 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52  gion */.  u8 isR
22b40 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadonly;        
22b50 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22b60 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 75  read-only */.  u
22b70 38 20 69 73 55 6e 6c 6f 63 6b 65 64 3b 20 20 20  8 isUnlocked;   
22b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
22b90 65 20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f 63 6b  e if no DMS lock
22ba0 20 68 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20   held */.  char 
22bb0 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20  **apRegion;     
22bc0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
22bd0 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d  f mapped shared-
22be0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
22bf0 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
22c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  * Number of unix
22c20 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
22c30 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
22c40 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73    unixShm *pFirs
22c50 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
22c60 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  All unixShm obje
22c70 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
22c80 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  this */.#ifdef S
22c90 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
22ca0 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
22cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
22cc0 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
22cd0 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
22ce0 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
22cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
22d00 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
22d10 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65   held */.  u8 ne
22d20 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
22d30 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
22d40 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e  ailable unixShm.
22d50 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
22d60 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
22d70 45 5f 4d 55 54 45 58 46 52 45 45 5f 53 48 4d 4c  E_MUTEXFREE_SHML
22d80 4f 43 4b 0a 20 20 2f 2a 20 49 6e 20 75 6e 69 78  OCK.  /* In unix
22d90 2d 65 78 63 6c 20 6d 6f 64 65 2c 20 69 66 20 53  -excl mode, if S
22da0 51 4c 49 54 45 5f 4d 55 54 45 58 46 52 45 45 5f  QLITE_MUTEXFREE_
22db0 53 48 4d 4c 4f 43 4b 20 69 73 20 64 65 66 69 6e  SHMLOCK is defin
22dc0 65 64 2c 20 61 6c 6c 20 6c 6f 63 6b 73 0a 20 20  ed, all locks.  
22dd0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
22de0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 36   the following 6
22df0 34 2d 62 69 74 20 76 61 6c 75 65 2e 20 54 68 65  4-bit value. The
22e00 72 65 20 61 72 65 20 69 6e 20 74 6f 74 61 6c 20  re are in total 
22e10 38 20 0a 20 20 2a 2a 20 73 68 6d 2d 6c 6f 63 6b  8 .  ** shm-lock
22e20 69 6e 67 20 73 6c 6f 74 73 2c 20 65 61 63 68 20  ing slots, each 
22e30 6f 66 20 77 68 69 63 68 20 61 72 65 20 61 73 73  of which are ass
22e40 69 67 6e 65 64 20 38 2d 62 69 74 73 20 66 72 6f  igned 8-bits fro
22e50 6d 20 74 68 65 20 36 34 2d 62 69 74 0a 20 20 2a  m the 64-bit.  *
22e60 2a 20 76 61 6c 75 65 2e 20 54 68 65 20 6c 65 61  * value. The lea
22e70 73 74 2d 73 69 67 6e 69 66 69 63 61 6e 74 20 38  st-significant 8
22e80 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
22e90 20 74 6f 20 73 68 6d 2d 6c 6f 63 6b 69 6e 67 20   to shm-locking 
22ea0 73 6c 6f 74 0a 20 20 2a 2a 20 30 2c 20 61 6e 64  slot.  ** 0, and
22eb0 20 73 6f 20 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a   so on..  **.  *
22ec0 2a 20 49 66 20 74 68 65 20 38 2d 62 69 74 73 20  * If the 8-bits 
22ed0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
22ee0 20 61 20 73 68 6d 2d 6c 6f 63 6b 69 6e 67 20 6c   a shm-locking l
22ef0 6f 63 6b 69 6e 67 20 73 6c 6f 74 20 61 72 65 20  ocking slot are 
22f00 73 65 74 20 74 6f 0a 20 20 2a 2a 20 30 78 46 46  set to.  ** 0xFF
22f10 2c 20 74 68 65 6e 20 61 20 77 72 69 74 65 2d 6c  , then a write-l
22f20 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
22f30 68 65 20 73 6c 6f 74 2e 20 4f 72 2c 20 69 66 20  he slot. Or, if 
22f40 74 68 65 79 20 61 72 65 20 73 65 74 20 74 6f 0a  they are set to.
22f50 20 20 2a 2a 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20    ** a non-zero 
22f60 76 61 6c 75 65 20 73 6d 61 6c 6c 65 72 20 74 68  value smaller th
22f70 61 6e 20 30 78 46 46 2c 20 74 68 65 6e 20 74 68  an 0xFF, then th
22f80 65 79 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ey represent the
22f90 20 74 6f 74 61 6c 20 0a 20 20 2a 2a 20 6e 75 6d   total .  ** num
22fa0 62 65 72 20 6f 66 20 72 65 61 64 2d 6c 6f 63 6b  ber of read-lock
22fb0 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 6c  s held on the sl
22fc0 6f 74 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ot. There is no 
22fd0 77 61 79 20 74 6f 20 64 69 73 74 69 6e 67 75 69  way to distingui
22fe0 73 68 0a 20 20 2a 2a 20 62 65 74 77 65 65 6e 20  sh.  ** between 
22ff0 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 61 6e 64  a write-lock and
23000 20 32 35 35 20 72 65 61 64 2d 6c 6f 63 6b 73 2e   255 read-locks.
23010 20 20 2a 2f 0a 20 20 75 36 34 20 6c 6f 63 6b 6d    */.  u64 lockm
23020 61 73 6b 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  ask;.#endif.};..
23030 2f 2a 0a 2a 2a 20 41 74 6f 6d 69 63 20 43 41 53  /*.** Atomic CAS
23040 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20   primitive used 
23050 69 6e 20 6d 75 6c 74 69 2d 70 72 6f 63 65 73 73  in multi-process
23060 20 6d 6f 64 65 2e 20 45 71 75 69 76 61 6c 65 6e   mode. Equivalen
23070 74 20 74 6f 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 69  t to:.** .**   i
23080 6e 74 20 75 6e 69 78 43 6f 6d 70 61 72 65 41 6e  nt unixCompareAn
23090 64 53 77 61 70 28 75 33 32 20 2a 70 74 72 2c 20  dSwap(u32 *ptr, 
230a0 75 33 32 20 6f 6c 64 76 61 6c 2c 20 75 33 32 20  u32 oldval, u32 
230b0 6e 65 77 76 61 6c 29 7b 0a 2a 2a 20 20 20 20 20  newval){.**     
230c0 69 66 28 20 2a 70 74 72 3d 3d 6f 6c 64 76 61 6c  if( *ptr==oldval
230d0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 2a 70 74   ){.**       *pt
230e0 72 20 3d 20 6e 65 77 76 61 6c 3b 0a 2a 2a 20 20  r = newval;.**  
230f0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 2a       return 1;.*
23100 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 72  *     }.**     r
23110 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a  eturn 0;.**   }.
23120 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 43  */.#define unixC
23130 6f 6d 70 61 72 65 41 6e 64 53 77 61 70 28 70 74  ompareAndSwap(pt
23140 72 2c 6f 6c 64 76 61 6c 2c 6e 65 77 76 61 6c 29  r,oldval,newval)
23150 20 5c 0a 20 20 20 20 5f 5f 73 79 6e 63 5f 62 6f   \.    __sync_bo
23160 6f 6c 5f 63 6f 6d 70 61 72 65 5f 61 6e 64 5f 73  ol_compare_and_s
23170 77 61 70 28 70 74 72 2c 6f 6c 64 76 61 6c 2c 6e  wap(ptr,oldval,n
23180 65 77 76 61 6c 29 0a 0a 0a 2f 2a 0a 2a 2a 20 53  ewval).../*.** S
23190 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
231a0 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
231b0 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
231c0 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
231d0 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
231e0 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
231f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
23200 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
23210 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
23220 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
23230 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
23240 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
23250 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
23260 20 20 75 6e 69 78 53 68 6d 2e 70 53 68 6d 4e 6f    unixShm.pShmNo
23270 64 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  de.**    unixShm
23280 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
23290 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
232a0 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
232b0 75 6e 69 78 53 68 6d 2e 70 53 68 6d 4e 6f 64 65  unixShm.pShmNode
232c0 2d 3e 70 53 68 6d 4d 75 74 65 78 20 6d 75 73 74  ->pShmMutex must
232d0 0a 2a 2a 20 62 65 20 68 65 6c 64 20 77 68 69 6c  .** be held whil
232e0 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
232f0 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
23300 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  s..*/.struct uni
23310 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d  xShm {.  unixShm
23320 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
23330 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
23340 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64  lying unixShmNod
23350 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e  e object */.  un
23360 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  ixShm *pNext;   
23370 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
23380 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68   unixShm with th
23390 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f  e same unixShmNo
233a0 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
233b0 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
233c0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
233d0 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68  lding the unixSh
233e0 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78  mNode->pShmMutex
233f0 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20   */.  u8 id;    
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
23420 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e  onnection within
23430 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65   its unixShmNode
23440 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
23450 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
23460 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
23470 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
23480 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
234a0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
234b0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
234c0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
234d0 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
234e0 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
234f0 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
23500 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
23510 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
23520 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
23530 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
23540 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
23550 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
23560 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
23570 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
23580 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
23590 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
235a0 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
235b0 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
235c0 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
235d0 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
235e0 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
235f0 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
23600 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
23610 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
23620 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
23630 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
23640 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
23650 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
23660 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
23670 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57  nection to the W
23680 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  AL file */.  int
23690 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
236a0 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
236b0 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
236c0 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
236d0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
236e0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
236f0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
23700 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23720 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
23730 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
23740 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
23750 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c  ShmNode; /* Appl
23760 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
23770 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
23780 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
23790 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
237a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
237b0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
237c0 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
237d0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
237e0 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
237f0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
23800 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
23810 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
23820 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
23830 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
23840 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
23850 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69    pShmNode = pFi
23860 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  le->pInode->pShm
23870 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
23880 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
23890 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
238a0 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
238b0 2d 3e 70 53 68 6d 4d 75 74 65 78 29 20 29 3b 0a  ->pShmMutex) );.
238c0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
238d0 64 65 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 75 6e  de->nRef>0 || un
238e0 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
238f0 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
23900 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
23910 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
23920 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
23930 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
23940 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
23950 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
23960 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
23970 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
23980 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
23990 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  K );..  if( pShm
239a0 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b  Node->hShm>=0 ){
239b0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
239c0 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
239d0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
239e0 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b   f.l_type = lock
239f0 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68  Type;.    f.l_wh
23a00 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
23a10 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d  .    f.l_start =
23a20 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c   ofst;.    f.l_l
23a30 65 6e 20 3d 20 6e 3b 0a 20 20 20 20 72 63 20 3d  en = n;.    rc =
23a40 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73   osSetPosixAdvis
23a50 6f 72 79 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  oryLock(pShmNode
23a60 2d 3e 68 53 68 6d 2c 20 26 66 2c 20 70 46 69 6c  ->hShm, &f, pFil
23a70 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  e);.    rc = (rc
23a80 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
23a90 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
23aa0 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
23ab0 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
23ac0 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
23ad0 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
23ae0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
23af0 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
23b00 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
23b10 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
23b20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f  mask = ofst>31 ?
23b30 20 30 78 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f   0xffff : (1<<(o
23b40 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66  fst+n)) - (1<<of
23b50 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  st);.  if( rc==S
23b60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23b70 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
23b80 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
23b90 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
23ba0 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
23bb0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
23bc0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
23bd0 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
23be0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
23bf0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73   ~mask;.    }els
23c00 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
23c10 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
23c20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
23c30 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
23c40 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
23c50 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
23c60 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
23c70 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
23c80 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
23c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
23ca0 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46  ert( lockType==F
23cb0 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20  _WRLCK );.      
23cc0 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d  OSTRACE(("write-
23cd0 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
23ce0 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
23cf0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d  ode->exclMask |=
23d00 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68   mask;.      pSh
23d10 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
23d20 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
23d30 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
23d40 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55  f( lockType==F_U
23d50 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  NLCK ){.      OS
23d60 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25  TRACE(("unlock %
23d70 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
23d80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
23d90 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
23da0 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
23db0 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
23dc0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d  failed"));.    }
23dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
23de0 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  rt( lockType==F_
23df0 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f  WRLCK );.      O
23e00 53 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c  STRACE(("write-l
23e10 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
23e20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ofst));.    }.  
23e30 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d  }.  OSTRACE((" -
23e40 20 61 66 74 65 72 77 61 72 64 73 20 25 30 33 78   afterwards %03x
23e50 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
23e60 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
23e70 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e  haredMask, pShmN
23e80 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  ode->exclMask));
23e90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
23ea0 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20  eturn rc;       
23eb0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   .}../*.** Retur
23ec0 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75  n the minimum nu
23ed0 6d 62 65 72 20 6f 66 20 33 32 4b 42 20 73 68 6d  mber of 32KB shm
23ee0 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 73 68   regions that sh
23ef0 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20 61  ould be mapped a
23f00 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73 73  t.** a time, ass
23f10 75 6d 69 6e 67 20 74 68 61 74 20 65 61 63 68 20  uming that each 
23f20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
23f30 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
23f40 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75  ple of the.** cu
23f50 72 72 65 6e 74 20 73 79 73 74 65 6d 20 70 61 67  rrent system pag
23f60 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73  e-size..**.** Us
23f70 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 31  ually, this is 1
23f80 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
23f90 73 65 65 6d 73 20 74 6f 20 62 65 20 73 79 73 74  seems to be syst
23fa0 65 6d 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  ems that are con
23fb0 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73  figured.** to us
23fc0 65 20 36 34 4b 42 20 70 61 67 65 73 20 2d 20 69  e 64KB pages - i
23fd0 6e 20 74 68 69 73 20 63 61 73 65 20 65 61 63 68  n this case each
23fe0 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 63 6f   mapping must co
23ff0 76 65 72 20 61 74 20 6c 65 61 73 74 20 74 77 6f  ver at least two
24000 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e  .** shm regions.
24010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
24020 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
24030 61 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  ap(void){.  int 
24040 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b  shmsz = 32*1024;
24050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24060 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a  HM region size *
24070 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f  /.  int pgsz = o
24080 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 20  sGetpagesize(); 
24090 20 20 2f 2a 20 53 79 73 74 65 6d 20 70 61 67 65    /* System page
240a0 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72   size */.  asser
240b0 74 28 20 28 28 70 67 73 7a 2d 31 29 26 70 67 73  t( ((pgsz-1)&pgs
240c0 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61  z)==0 );   /* Pa
240d0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
240e0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a  a power of 2 */.
240f0 20 20 69 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a    if( pgsz<shmsz
24100 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
24110 65 74 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a  eturn pgsz/shmsz
24120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  ;.}../*.** Purge
24130 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
24140 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
24150 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e   entries with un
24160 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
24170 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  0..**.** This is
24180 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65   not a VFS share
24190 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b  d-memory method;
241a0 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79   it is a utility
241b0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
241c0 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65  .** by VFS share
241d0 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73  d-memory methods
241e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
241f0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e   unixShmPurge(un
24200 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
24210 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d  unixShmNode *p =
24220 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53   pFd->pInode->pS
24230 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  hmNode;.  assert
24240 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
24250 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  ) );.  if( p && 
24260 41 4c 57 41 59 53 28 70 2d 3e 6e 52 65 66 3d 3d  ALWAYS(p->nRef==
24270 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  0) ){.    int nS
24280 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53  hmPerMap = unixS
24290 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29  hmRegionPerMap()
242a0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
242b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f   assert( p->pIno
242c0 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20  de==pFd->pInode 
242d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
242e0 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 70 53 68  utex_free(p->pSh
242f0 6d 4d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  mMutex);.    for
24300 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
24310 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61  on; i+=nShmPerMa
24320 70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  p){.      if( p-
24330 3e 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20  >hShm>=0 ){.    
24340 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e      osMunmap(p->
24350 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
24360 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
24370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24380 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
24390 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
243a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
243b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
243c0 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
243d0 66 28 20 70 2d 3e 68 53 68 6d 3e 3d 30 20 29 7b  f( p->hShm>=0 ){
243e0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
243f0 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 53 68 6d  ose(pFd, p->hShm
24400 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
24410 20 20 20 70 2d 3e 68 53 68 6d 20 3d 20 2d 31 3b     p->hShm = -1;
24420 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49  .    }.    p->pI
24430 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
24440 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
24450 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
24460 2f 2a 0a 2a 2a 20 54 68 65 20 44 4d 53 20 6c 6f  /*.** The DMS lo
24470 63 6b 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ck has not yet b
24480 65 65 6e 20 74 61 6b 65 6e 20 6f 6e 20 73 68 6d  een taken on shm
24490 20 66 69 6c 65 20 70 53 68 6d 4e 6f 64 65 2e 20   file pShmNode. 
244a0 41 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 74 61  Attempt to.** ta
244b0 6b 65 20 69 74 20 6e 6f 77 2e 20 52 65 74 75 72  ke it now. Retur
244c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
244d0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
244e0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
244f0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
24500 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 44 4d  .**.** If the DM
24510 53 20 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 63 6b  S cannot be lock
24520 65 64 20 62 65 63 61 75 73 65 20 74 68 69 73 20  ed because this 
24530 69 73 20 61 20 72 65 61 64 6f 6e 6c 79 5f 73 68  is a readonly_sh
24540 6d 3d 31 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  m=1 .** connecti
24550 6f 6e 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  on and no other 
24560 70 72 6f 63 65 73 73 20 61 6c 72 65 61 64 79 20  process already 
24570 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 2c 20 72 65  holds a lock, re
24580 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 52  turn.** SQLITE_R
24590 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54  EADONLY_CANTINIT
245a0 20 61 6e 64 20 73 65 74 20 70 53 68 6d 4e 6f 64   and set pShmNod
245b0 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e  e->isUnlocked=1.
245c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
245d0 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d  nixLockSharedMem
245e0 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
245f0 62 46 64 2c 20 75 6e 69 78 53 68 6d 4e 6f 64 65  bFd, unixShmNode
24600 20 2a 70 53 68 6d 4e 6f 64 65 29 7b 0a 20 20 73   *pShmNode){.  s
24610 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
24620 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24630 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 55 73  ITE_OK;..  /* Us
24640 65 20 46 5f 47 45 54 4c 4b 20 74 6f 20 64 65 74  e F_GETLK to det
24650 65 72 6d 69 6e 65 20 74 68 65 20 6c 6f 63 6b 73  ermine the locks
24660 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
24670 20 61 72 65 20 68 6f 6c 64 69 6e 67 0a 20 20 2a   are holding.  *
24680 2a 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74  * on the DMS byt
24690 65 2e 20 49 66 20 69 74 20 69 6e 64 69 63 61 74  e. If it indicat
246a0 65 73 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  es that another 
246b0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
246c0 6e 67 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44  ng.  ** a SHARED
246d0 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 69 73   lock, then this
246e0 20 70 72 6f 63 65 73 73 20 6d 61 79 20 61 6c 73   process may als
246f0 6f 20 74 61 6b 65 20 61 20 53 48 41 52 45 44 20  o take a SHARED 
24700 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 70 72  lock.  ** and pr
24710 6f 63 65 65 64 20 77 69 74 68 20 6f 70 65 6e 69  oceed with openi
24720 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  ng the *-shm fil
24730 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72  e. .  **.  ** Or
24740 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 70 72  , if no other pr
24750 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
24760 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20   any lock, then 
24770 74 68 69 73 20 70 72 6f 63 65 73 73 0a 20 20 2a  this process.  *
24780 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  * is the first t
24790 6f 20 6f 70 65 6e 20 69 74 2e 20 49 6e 20 74 68  o open it. In th
247a0 69 73 20 63 61 73 65 20 74 61 6b 65 20 61 6e 20  is case take an 
247b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
247c0 6e 20 74 68 65 0a 20 20 2a 2a 20 44 4d 53 20 62  n the.  ** DMS b
247d0 79 74 65 20 61 6e 64 20 74 72 75 6e 63 61 74 65  yte and truncate
247e0 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20   the *-shm file 
247f0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
24800 20 73 69 7a 65 2e 20 54 68 65 6e 0a 20 20 2a 2a   size. Then.  **
24810 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
24820 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
24830 68 65 20 44 4d 53 20 62 79 74 65 2e 0a 20 20 2a  he DMS byte..  *
24840 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 6f 74 68 65  *.  ** If anothe
24850 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
24860 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
24870 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d  E lock on the DM
24880 53 20 62 79 74 65 2c 0a 20 20 2a 2a 20 72 65 74  S byte,.  ** ret
24890 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
248a0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 28 69  to the caller (i
248b0 74 20 77 69 6c 6c 20 74 72 79 20 61 67 61 69 6e  t will try again
248c0 29 2e 20 41 6e 20 65 61 72 6c 69 65 72 0a 20 20  ). An earlier.  
248d0 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ** version of th
248e0 69 73 20 63 6f 64 65 20 61 74 74 65 6d 70 74 65  is code attempte
248f0 64 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  d the SHARED loc
24900 6b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  k at this point.
24910 20 42 75 74 0a 20 20 2a 2a 20 74 68 69 73 20 69   But.  ** this i
24920 6e 74 72 6f 64 75 63 65 64 20 61 20 73 75 62 74  ntroduced a subt
24930 6c 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  le race conditio
24940 6e 3a 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  n: if the proces
24950 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 45  s holding.  ** E
24960 58 43 4c 55 53 49 56 45 20 66 61 69 6c 65 64 20  XCLUSIVE failed 
24970 6a 75 73 74 20 62 65 66 6f 72 65 20 74 72 75 6e  just before trun
24980 63 61 74 69 6e 67 20 74 68 65 20 2a 2d 73 68 6d  cating the *-shm
24990 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 69 73   file, then this
249a0 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6d 69  .  ** process mi
249b0 67 68 74 20 6f 70 65 6e 20 61 6e 64 20 75 73 65  ght open and use
249c0 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20   the *-shm file 
249d0 77 69 74 68 6f 75 74 20 74 72 75 6e 63 61 74 69  without truncati
249e0 6e 67 20 69 74 2e 0a 20 20 2a 2a 20 41 6e 64 20  ng it..  ** And 
249f0 69 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  if the *-shm fil
24a00 65 20 68 61 73 20 62 65 65 6e 20 63 6f 72 72 75  e has been corru
24a10 70 74 65 64 20 62 79 20 61 20 70 6f 77 65 72 20  pted by a power 
24a20 66 61 69 6c 75 72 65 20 6f 72 0a 20 20 2a 2a 20  failure or.  ** 
24a30 73 79 73 74 65 6d 20 63 72 61 73 68 2c 20 74 68  system crash, th
24a40 65 20 64 61 74 61 62 61 73 65 20 69 74 73 65 6c  e database itsel
24a50 66 20 6d 61 79 20 61 6c 73 6f 20 62 65 63 6f 6d  f may also becom
24a60 65 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  e corrupt.  */. 
24a70 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
24a80 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
24a90 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 55 4e 49 58  k.l_start = UNIX
24aa0 5f 53 48 4d 5f 44 4d 53 3b 0a 20 20 6c 6f 63 6b  _SHM_DMS;.  lock
24ab0 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
24ac0 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
24ad0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
24ae0 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68  tl(pShmNode->hSh
24af0 6d 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  m, F_GETLK, &loc
24b00 6b 29 21 3d 30 20 29 20 7b 0a 20 20 20 20 72 63  k)!=0 ) {.    rc
24b10 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
24b20 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LOCK;.  }else if
24b30 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46  ( lock.l_type==F
24b40 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 69 66  _UNLCK ){.    if
24b50 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65  ( pShmNode->isRe
24b60 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adonly ){.      
24b70 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f  pShmNode->isUnlo
24b80 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  cked = 1;.      
24b90 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
24ba0 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3b 0a 20  ONLY_CANTINIT;. 
24bb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24bc0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
24bd0 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
24be0 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  WRLCK, UNIX_SHM_
24bf0 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  DMS, 1);.      /
24c00 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6e 6e  * The first conn
24c10 65 63 74 69 6f 6e 20 74 6f 20 61 74 74 61 63 68  ection to attach
24c20 20 6d 75 73 74 20 74 72 75 6e 63 61 74 65 20 74   must truncate t
24c30 68 65 20 2d 73 68 6d 20 66 69 6c 65 2e 20 20 57  he -shm file.  W
24c40 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63  e.      ** trunc
24c50 61 74 65 20 74 6f 20 33 20 62 79 74 65 73 20 28  ate to 3 bytes (
24c60 61 6e 20 61 72 62 69 74 72 61 72 79 20 73 6d 61  an arbitrary sma
24c70 6c 6c 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20  ll number, less 
24c80 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  than the.      *
24c90 2a 20 2d 73 68 6d 20 68 65 61 64 65 72 20 73 69  * -shm header si
24ca0 7a 65 29 20 72 61 74 68 65 72 20 74 68 61 6e 20  ze) rather than 
24cb0 30 20 61 73 20 61 20 73 79 73 74 65 6d 20 64 65  0 as a system de
24cc0 62 75 67 67 69 6e 67 20 61 69 64 2c 20 74 6f 0a  bugging aid, to.
24cd0 20 20 20 20 20 20 2a 2a 20 68 65 6c 70 20 64 65        ** help de
24ce0 74 65 63 74 20 69 66 20 61 20 2d 73 68 6d 20 66  tect if a -shm f
24cf0 69 6c 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 69  ile truncation i
24d00 73 20 6c 65 67 69 74 69 6d 61 74 65 20 6f 72 20  s legitimate or 
24d10 69 73 20 74 68 65 20 77 6f 72 6b 0a 20 20 20 20  is the work.    
24d20 20 20 2a 2a 20 6f 72 20 61 20 72 6f 67 75 65 20    ** or a rogue 
24d30 70 72 6f 63 65 73 73 2e 20 2a 2f 0a 20 20 20 20  process. */.    
24d40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24d50 5f 4f 4b 20 26 26 20 72 6f 62 75 73 74 5f 66 74  _OK && robust_ft
24d60 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
24d70 2d 3e 68 53 68 6d 2c 20 33 29 20 29 7b 0a 20 20  ->hShm, 3) ){.  
24d80 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
24d90 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
24da0 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 22 66 74  OERR_SHMOPEN,"ft
24db0 72 75 6e 63 61 74 65 22 2c 70 53 68 6d 4e 6f 64  runcate",pShmNod
24dc0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
24dd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24de0 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
24df0 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
24e00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
24e10 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 69 66  _BUSY;.  }..  if
24e20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24e30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  ){.    assert( l
24e40 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e  ock.l_type==F_UN
24e50 4c 43 4b 20 7c 7c 20 6c 6f 63 6b 2e 6c 5f 74 79  LCK || lock.l_ty
24e60 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 20  pe==F_RDLCK );. 
24e70 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
24e80 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
24e90 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_RDLCK, UNIX_S
24ea0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a  HM_DMS, 1);.  }.
24eb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24ec0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
24ed0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
24ee0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
24ef0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
24f00 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
24f10 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
24f20 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
24f30 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
24f40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
24f50 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
24f60 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
24f70 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
24f80 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
24f90 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
24fa0 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
24fb0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
24fc0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
24fd0 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
24fe0 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
24ff0 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
25000 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
25010 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
25020 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
25030 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
25040 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
25050 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
25060 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
25070 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
25080 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
25090 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
250a0 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
250b0 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
250c0 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
250d0 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
250e0 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
250f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
25100 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
25110 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
25120 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
25130 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
25140 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
25150 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
25160 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
25170 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
25180 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
25190 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
251a0 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
251b0 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
251c0 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
251d0 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
251e0 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
251f0 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
25200 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
25210 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
25220 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
25230 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
25240 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
25250 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
25260 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
25270 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
25280 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
25290 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
252a0 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
252b0 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
252c0 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
252d0 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
252e0 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
252f0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
25300 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
25310 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
25320 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
25330 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
25340 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
25350 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
25360 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
25370 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
25380 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
25390 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
253a0 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
253b0 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
253c0 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
253d0 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
253e0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
253f0 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
25400 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
25410 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
25420 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
25430 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
25440 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
25450 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
25460 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
25470 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
25480 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
25490 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
254a0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
254b0 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
254c0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
254d0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
254e0 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
254f0 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
25500 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
25510 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
25520 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
25530 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
25540 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
25550 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
25560 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
25570 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
25580 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
25590 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
255a0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
255b0 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
255c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
255d0 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
255e0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
255f0 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
25600 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
25610 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
25620 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
25630 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
25640 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
25650 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
25660 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
25670 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
25680 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
25690 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
256a0 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
256b0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
256c0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
256d0 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
256e0 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
256f0 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
25700 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
25710 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
25720 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
25730 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
25740 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
25750 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
25760 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ile */.  int rc 
25770 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
25780 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
25790 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
257a0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
257b0 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
257c0 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
257d0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 3b  */.  char *zShm;
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
257f0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
25800 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f   used for SHM */
25810 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e  .  int nShmFilen
25820 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
25830 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
25840 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69  e SHM filename i
25850 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
25860 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
25870 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
25880 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  Shm object. */. 
25890 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
258a0 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
258b0 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
258c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
258d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65  NOMEM_BKPT;.  me
258e0 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
258f0 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74  f(*p));.  assert
25900 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
25910 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
25920 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78  to see if a unix
25930 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61  ShmNode object a
25940 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52  lready exists. R
25950 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
25960 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65  .  ** one if pre
25970 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e  sent. Create a n
25980 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
25990 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ary..  */.  asse
259a0 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65  rt( unixFileMute
259b0 78 4e 6f 74 68 65 6c 64 28 70 44 62 46 64 29 20  xNotheld(pDbFd) 
259c0 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
259d0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
259e0 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
259f0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49  .  pShmNode = pI
25a00 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
25a10 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
25a20 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
25a30 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
25a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
25a50 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20  stat() info for 
25a60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25a80 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20  SHM_DIRECTORY.  
25a90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
25aa0 61 73 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d  asePath = pDbFd-
25ab0 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a  >zPath;.#endif..
25ac0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61      /* Call fsta
25ad0 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
25ae0 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  t the permission
25af0 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  s on the databas
25b00 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a  e file. If.    *
25b10 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69  * a new *-shm fi
25b20 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61  le is created, a
25b30 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62  n attempt will b
25b40 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65  e made to create
25b50 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20   it.    ** with 
25b60 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
25b70 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ions..    */.   
25b80 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62   if( osFstat(pDb
25b90 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  Fd->h, &sStat) )
25ba0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
25bb0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
25bc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
25bd0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
25be0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
25bf0 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
25c00 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
25c10 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48  sizeof(SQLITE_SH
25c20 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33  M_DIRECTORY) + 3
25c30 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68  1;.#else.    nSh
25c40 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20  mFilename = 6 + 
25c50 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73  (int)strlen(zBas
25c60 65 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20  ePath);.#endif. 
25c70 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71     pShmNode = sq
25c80 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
25c90 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
25ca0 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ) + nShmFilename
25cb0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   );.    if( pShm
25cc0 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Node==0 ){.     
25cd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
25ce0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
25cf0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
25d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
25d10 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20  et(pShmNode, 0, 
25d20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
25d30 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  )+nShmFilename);
25d40 0a 20 20 20 20 7a 53 68 6d 20 3d 20 70 53 68 6d  .    zShm = pShm
25d50 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
25d60 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
25d70 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  de[1];.#ifdef SQ
25d80 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
25d90 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  RY.    sqlite3_s
25da0 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
25db0 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 0a 20 20 20  name, zShm, .   
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52    SQLITE_SHM_DIR
25de0 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d  ECTORY "/sqlite-
25df0 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20  shm-%x-%x",.    
25e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e10 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69   (u32)sStat.st_i
25e20 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73  no, (u32)sStat.s
25e30 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20  t_dev);.#else.  
25e40 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
25e50 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
25e60 20 7a 53 68 6d 2c 20 22 25 73 2d 73 68 6d 22 2c   zShm, "%s-shm",
25e70 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20   zBasePath);.   
25e80 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
25e90 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
25ea0 2c 20 7a 53 68 6d 29 3b 0a 23 65 6e 64 69 66 0a  , zShm);.#endif.
25eb0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53      pShmNode->hS
25ec0 68 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  hm = -1;.    pDb
25ed0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
25ee0 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
25ef0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
25f00 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
25f10 49 6e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 73  Inode;.    if( s
25f20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
25f30 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
25f40 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
25f50 3e 70 53 68 6d 4d 75 74 65 78 20 3d 20 73 71 6c  >pShmMutex = sql
25f60 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
25f70 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
25f80 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ST);.      if( p
25f90 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74  ShmNode->pShmMut
25fa0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
25fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
25fc0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
25fd0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
25fe0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
25ff0 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  }..    if( pInod
26000 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
26010 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
26020 30 3d 3d 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  0==sqlite3_uri_b
26030 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50  oolean(pDbFd->zP
26040 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73  ath, "readonly_s
26050 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  hm", 0) ){.     
26060 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68     pShmNode->hSh
26070 6d 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  m = robust_open(
26080 7a 53 68 6d 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  zShm, O_RDWR|O_C
26090 52 45 41 54 2c 28 73 53 74 61 74 2e 73 74 5f 6d  REAT,(sStat.st_m
260a0 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20  ode&0777));.    
260b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 53    }.      if( pS
260c0 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3c 30 20 29  hmNode->hShm<0 )
260d0 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  {.        pShmNo
260e0 64 65 2d 3e 68 53 68 6d 20 3d 20 72 6f 62 75 73  de->hShm = robus
260f0 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52  t_open(zShm, O_R
26100 44 4f 4e 4c 59 2c 20 28 73 53 74 61 74 2e 73 74  DONLY, (sStat.st
26110 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20  _mode&0777));.  
26120 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
26130 64 65 2d 3e 68 53 68 6d 3c 30 20 29 7b 0a 20 20  de->hShm<0 ){.  
26140 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
26150 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
26160 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
26170 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 29 3b 0a 20  "open", zShm);. 
26180 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
26190 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
261a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 53      }.        pS
261b0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
261c0 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ly = 1;.      }.
261d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
261e0 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e  s process is run
261f0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61  ning as root, ma
26200 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
26210 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20   SHM file.      
26220 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74  ** is owned by t
26230 68 65 20 73 61 6d 65 20 75 73 65 72 20 74 68 61  he same user tha
26240 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69  t owns the origi
26250 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f  nal database.  O
26260 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
26270 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
26280 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62  owner will not b
26290 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  e able to connec
262a0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
262b0 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 70    robustFchown(p
262c0 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c 20 73  ShmNode->hShm, s
262d0 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74  Stat.st_uid, sSt
262e0 61 74 2e 73 74 5f 67 69 64 29 3b 0a 0a 20 20 20  at.st_gid);..   
262f0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b     rc = unixLock
26300 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
26310 46 64 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20  Fd, pShmNode);. 
26320 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26330 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
26340 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
26350 4e 54 49 4e 49 54 20 29 20 67 6f 74 6f 20 73 68  NTINIT ) goto sh
26360 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
26370 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
26380 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
26390 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
263a0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  he unixShmNode *
263b0 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
263c0 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
263d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
263e0 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
263f0 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
26400 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
26410 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
26420 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
26430 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
26440 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
26450 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
26460 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
26470 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
26480 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
26490 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
264a0 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
264b0 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
264c0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
264d0 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
264e0 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65  ct unixShm) obje
264f0 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
26500 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
26510 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
26520 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
26530 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
26540 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
26550 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
26560 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
26570 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
26580 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
26590 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
265a0 68 65 0a 20 20 2a 2a 20 70 53 68 6d 4e 6f 64 65  he.  ** pShmNode
265b0 2d 3e 70 53 68 6d 4d 75 74 65 78 2e 0a 20 20 2a  ->pShmMutex..  *
265c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
265d0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
265e0 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20  ->pShmMutex);.  
265f0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
26600 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
26610 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
26620 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
26630 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
26640 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b  ode->pShmMutex);
26650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20  .  return rc;.. 
26660 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
26670 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
26680 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
26690 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
266a0 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  );       /* This
266b0 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
266c0 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
266d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
266e0 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61  ee(p);.  unixLea
266f0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
26700 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26710 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
26720 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
26730 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
26740 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
26750 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
26760 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
26770 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
26780 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
26790 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
267a0 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
267b0 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
267c0 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
267d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
267e0 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
267f0 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
26800 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
26810 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
26820 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
26830 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
26840 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
26850 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
26860 66 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61  f the bExtend pa
26870 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
26880 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
26890 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
268a0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
268b0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
268c0 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
268d0 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
268e0 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
268f0 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
26900 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
26910 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
26920 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
26930 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73  f .** bExtend is
26940 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
26950 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
26960 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
26970 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
26980 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
26990 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
269a0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
269b0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
269c0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
269d0 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
269e0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
269f0 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
26a00 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
26a10 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
26a20 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
26a30 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
26a40 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
26a50 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
26a60 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
26a70 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
26a80 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
26a90 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
26aa0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
26ab0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
26ac0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61  ic int unixShmMa
26ad0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
26ae0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
26af0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
26b00 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
26b10 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
26b20 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
26b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
26b40 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
26b50 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
26b60 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
26b70 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
26b80 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
26b90 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20   bExtend,       
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26bb0 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
26bc0 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
26bd0 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
26be0 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
26bf0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
26c00 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
26c10 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
26c20 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
26c30 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  )fd;.  unixShm *
26c40 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  p;.  unixShmNode
26c50 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
26c60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26c70 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d  ;.  int nShmPerM
26c80 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69  ap = unixShmRegi
26c90 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e  onPerMap();.  in
26ca0 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20  t nReqRegion;.. 
26cb0 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65   /* If the share
26cc0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61  d-memory file ha
26cd0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
26ce0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
26cf0 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  ow. */.  if( pDb
26d00 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20  Fd->pShm==0 ){. 
26d10 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
26d20 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
26d30 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
26d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
26d50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
26d60 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
26d70 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
26d80 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69  pShmNode;.  sqli
26d90 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
26da0 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75  pShmNode->pShmMu
26db0 74 65 78 29 3b 0a 20 20 69 66 28 20 70 53 68 6d  tex);.  if( pShm
26dc0 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64  Node->isUnlocked
26dd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
26de0 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72  xLockSharedMemor
26df0 79 28 70 44 62 46 64 2c 20 70 53 68 6d 4e 6f 64  y(pDbFd, pShmNod
26e00 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
26e10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
26e20 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
26e30 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e    pShmNode->isUn
26e40 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  locked = 0;.  }.
26e50 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
26e60 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
26e70 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
26e80 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
26e90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
26ea0 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
26eb0 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
26ec0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
26ed0 65 2d 3e 68 53 68 6d 3e 3d 30 20 7c 7c 20 70 44  e->hShm>=0 || pD
26ee0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
26ef0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
26f00 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
26f10 64 65 2d 3e 68 53 68 6d 3c 30 20 7c 7c 20 70 44  de->hShm<0 || pD
26f20 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
26f30 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
26f40 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75  .  /* Minimum nu
26f50 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20  mber of regions 
26f60 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d  required to be m
26f70 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71  apped. */.  nReq
26f80 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69  Region = ((iRegi
26f90 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f  on+nShmPerMap) /
26fa0 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e   nShmPerMap) * n
26fb0 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66  ShmPerMap;..  if
26fc0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
26fd0 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29  ion<nReqRegion )
26fe0 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e  {.    char **apN
26ff0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
27000 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
27010 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79  apRegion[] array
27020 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
27030 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73  e = nReqRegion*s
27040 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69  zRegion;   /* Mi
27050 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
27060 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
27070 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
27080 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27090 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73     /* Used by fs
270a0 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53  tat() */..    pS
270b0 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
270c0 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20   = szRegion;..  
270d0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
270e0 68 53 68 6d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  hShm>=0 ){.     
270f0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
27100 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
27110 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
27120 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
27130 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20  ss space..      
27140 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
27150 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
27160 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
27170 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
27180 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  file is.      **
27190 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
271a0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71   contain the req
271b0 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a  uested region)..
271c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
271d0 66 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e  f( osFstat(pShmN
271e0 6f 64 65 2d 3e 68 53 68 6d 2c 20 26 73 53 74 61  ode->hShm, &sSta
271f0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
27200 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
27210 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
27220 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
27230 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
27240 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
27250 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
27260 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
27270 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
27280 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
27290 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
272a0 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
272b0 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
272c0 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
272d0 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
272e0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
272f0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
27300 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
27310 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20  !bExtend ){.    
27320 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
27330 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
27340 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  }..        /* Al
27350 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
27360 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
27370 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
27380 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20  . Do this by.   
27390 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20       ** writing 
273a0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
273b0 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
273c0 20 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67   (OS) page being
273d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
273e0 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
273f0 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  d. Technically, 
27400 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69  we need only wri
27410 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  te to the.      
27420 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69    ** last page i
27430 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e  n order to exten
27440 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20  d the file. But 
27450 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e  writing to all n
27460 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ew.        ** pa
27470 67 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f  ges forces the O
27480 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  S to allocate th
27490 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  em immediately, 
274a0 77 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20  which reduces.  
274b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61        ** the cha
274c0 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77  nces of SIGBUS w
274d0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74  hile accessing t
274e0 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
274f0 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20   later on..     
27500 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c     */.        el
27510 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
27520 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70  atic const int p
27530 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  gsz = 4096;.    
27540 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a        int iPg;..
27550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
27560 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62  te to the last b
27570 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c  yte of each newl
27580 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  y allocated or e
27590 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a  xtended page */.
275a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
275b0 28 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29  ( (nByte % pgsz)
275c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
275d0 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e   for(iPg=(sStat.
275e0 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69  st_size/pgsz); i
275f0 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b  Pg<(nByte/pgsz);
27600 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPg++){.       
27610 20 20 20 20 20 69 6e 74 20 78 20 3d 20 30 3b 0a       int x = 0;.
27620 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27630 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 70  seekAndWriteFd(p
27640 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c 20 69  ShmNode->hShm, i
27650 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31  Pg*pgsz + pgsz-1
27660 2c 22 22 2c 31 2c 26 78 29 21 3d 31 20 29 7b 0a  ,"",1,&x)!=1 ){.
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
27680 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
27690 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
276a0 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  ename;.         
276b0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
276c0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
276d0 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72  ERR_SHMSIZE, "wr
276e0 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  ite", zFile);.  
276f0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
27700 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
27710 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27730 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
27740 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
27750 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
27760 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
27770 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
27780 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
27790 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20    apNew = (char 
277a0 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
277b0 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
277c0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20  Node->apRegion, 
277d0 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f  nReqRegion*sizeo
277e0 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
277f0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
27800 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
27810 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
27820 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
27830 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
27840 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
27850 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
27860 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  New;.    while( 
27870 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
27880 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a  n<nReqRegion ){.
27890 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d        int nMap =
278a0 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65   szRegion*nShmPe
278b0 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rMap;.      int 
278c0 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  i;.      void *p
278d0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
278e0 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30  ShmNode->hShm>=0
278f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
27900 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61   = osMmap(0, nMa
27910 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  p,.            p
27920 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
27930 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20  nly ? PROT_READ 
27940 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54  : PROT_READ|PROT
27950 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20  _WRITE, .       
27960 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c       MAP_SHARED,
27970 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 2c   pShmNode->hShm,
27980 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70   szRegion*(i64)p
27990 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
279a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
279b0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
279c0 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
279d0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
279e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
279f0 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d  OERR_SHMMAP, "mm
27a00 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ap", pShmNode->z
27a10 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
27a20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
27a30 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
27a40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27a50 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c        pMem = sql
27a60 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 4d  ite3_malloc64(nM
27a70 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ap);.        if(
27a80 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20   pMem==0 ){.    
27a90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27aa0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
27ab0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
27ac0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
27ad0 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73    }.        mems
27ae0 65 74 28 70 4d 65 6d 2c 20 30 2c 20 6e 4d 61 70  et(pMem, 0, nMap
27af0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
27b00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68    for(i=0; i<nSh
27b10 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20  mPerMap; i++){. 
27b20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
27b30 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  >apRegion[pShmNo
27b40 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d  de->nRegion+i] =
27b50 20 26 28 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b   &((char*)pMem)[
27b60 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20  szRegion*i];.   
27b70 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e     }.      pShmN
27b80 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20  ode->nRegion += 
27b90 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20  nShmPerMap;.    
27ba0 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
27bb0 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
27bc0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
27bd0 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d  ion ){.    *pp =
27be0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
27bf0 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20  ion[iRegion];.  
27c00 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
27c10 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   0;.  }.  if( pS
27c20 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
27c30 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ly && rc==SQLITE
27c40 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54  _OK ) rc = SQLIT
27c50 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71  E_READONLY;.  sq
27c60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
27c70 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d  e(pShmNode->pShm
27c80 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
27c90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
27ca0 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
27cb0 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
27cc0 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
27cd0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
27ce0 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
27cf0 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64  p between SHAREd
27d00 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c   and EXCLUSIVE l
27d10 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ocks is a little
27d20 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65  .** different he
27d30 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78  re than in posix
27d40 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29  .  In xShmLock()
27d50 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f  , one can go fro
27d60 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f  m unlocked.** to
27d70 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b   shared and back
27d80 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   or from unlocke
27d90 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61  d to exclusive a
27da0 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e  nd back.  But on
27db0 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20  e may.** not go 
27dc0 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65  from shared to e
27dd0 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d  xclusive or from
27de0 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68   exclusive to sh
27df0 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
27e00 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28  int unixShmLock(
27e10 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
27e20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
27e30 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
27e40 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
27e50 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
27e60 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
27e70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
27e80 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
27e90 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
27ea0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27ec0 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
27ed0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
27ee0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
27ef0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
27f00 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
27f10 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
27f20 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  k */.){.  unixFi
27f30 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
27f40 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  xFile*)fd;      
27f50 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
27f60 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
27f70 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ory */.  unixShm
27f80 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
27f90 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
27fa0 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
27fb0 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
27fc0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
27fd0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
27fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27ff0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
28000 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
28010 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
28020 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
28030 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75  mNode;  /* The u
28040 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69  nderlying file i
28050 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Node */.  int rc
28060 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
28070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28080 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
28090 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
280a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
280c0 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
280d0 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
280e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
280f0 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
28100 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
28110 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
28120 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
28130 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
28140 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
28150 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54  && ofst+n<=SQLIT
28160 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20  E_SHM_NLOCK );. 
28170 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
28180 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
28190 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
281a0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
281b0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
281c0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
281d0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
281e0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
281f0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
28200 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
28210 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
28220 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
28230 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
28240 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
28250 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
28260 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65  USIVE) );.  asse
28270 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61  rt( n==1 || (fla
28280 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
28290 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b  EXCLUSIVE)!=0 );
282a0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
282b0 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20 7c 7c 20  ode->hShm>=0 || 
282c0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
282d0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
282e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
282f0 4e 6f 64 65 2d 3e 68 53 68 6d 3c 30 20 7c 7c 20  Node->hShm<0 || 
28300 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
28310 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
28320 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  ;..  mask = (1<<
28330 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
28340 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  ofst);.  assert(
28350 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
28360 3c 3c 6f 66 73 74 29 20 29 3b 0a 0a 23 69 66 64  <<ofst) );..#ifd
28370 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 46  ef SQLITE_MUTEXF
28380 52 45 45 5f 53 48 4d 4c 4f 43 4b 0a 20 20 69 66  REE_SHMLOCK.  if
28390 28 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ( pDbFd->pInode-
283a0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b  >bProcessLock ){
283b0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  ..    while( 1 )
283c0 7b 0a 20 20 20 20 20 20 75 36 34 20 6c 6f 63 6b  {.      u64 lock
283d0 6d 61 73 6b 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  mask = pShmNode-
283e0 3e 6c 6f 63 6b 6d 61 73 6b 3b 0a 20 20 20 20 20  >lockmask;.     
283f0 20 75 36 34 20 6e 65 77 6d 61 73 6b 20 3d 20 6c   u64 newmask = l
28400 6f 63 6b 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  ockmask;.      i
28410 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
28420 69 3d 6f 66 73 74 3b 20 69 3c 6e 2b 6f 66 73 74  i=ofst; i<n+ofst
28430 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
28440 69 6e 74 20 69 78 38 20 3d 20 69 2a 38 3b 0a 20  int ix8 = i*8;. 
28450 20 20 20 20 20 20 20 75 38 20 76 20 3d 20 28 6c         u8 v = (l
28460 6f 63 6b 6d 61 73 6b 20 3e 3e 20 28 69 78 38 29  ockmask >> (ix8)
28470 29 20 26 20 30 78 46 46 3b 0a 20 20 20 20 20 20  ) & 0xFF;.      
28480 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
28490 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
284a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
284b0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
284c0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  SHM_EXCLUSIVE ){
284d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
284e0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28   p->exclMask & (
284f0 31 20 3c 3c 20 69 29 20 29 7b 0a 20 20 20 20 20  1 << i) ){.     
28500 20 20 20 20 20 20 20 20 20 6e 65 77 6d 61 73 6b           newmask
28510 20 3d 20 6e 65 77 6d 61 73 6b 20 26 20 7e 28 28   = newmask & ~((
28520 75 36 34 29 30 78 46 46 3c 3c 69 78 38 29 3b 0a  u64)0xFF<<ix8);.
28530 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28540 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28550 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
28560 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 28  ->sharedMask & (
28570 31 20 3c 3c 20 69 29 20 29 7b 0a 20 20 20 20 20  1 << i) ){.     
28580 20 20 20 20 20 20 20 20 20 6e 65 77 6d 61 73 6b           newmask
28590 20 3d 20 6e 65 77 6d 61 73 6b 20 26 20 7e 28 28   = newmask & ~((
285a0 75 36 34 29 30 78 46 46 3c 3c 69 78 38 29 20 7c  u64)0xFF<<ix8) |
285b0 20 28 28 75 36 34 29 28 76 2d 31 29 3c 3c 69 78   ((u64)(v-1)<<ix
285c0 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  8);.            
285d0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
285e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
285f0 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73         if( flags
28600 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
28610 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
28620 20 20 20 20 20 20 20 69 66 28 20 76 20 29 20 72         if( v ) r
28630 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
28640 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  Y;.            i
28650 66 28 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 20  f( (p->exclMask 
28660 26 20 28 31 20 3c 3c 20 69 29 29 3d 3d 30 20 29  & (1 << i))==0 )
28670 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28680 6e 65 77 6d 61 73 6b 20 3d 20 6e 65 77 6d 61 73  newmask = newmas
28690 6b 20 7c 20 28 28 75 36 34 29 30 78 46 46 3c 3c  k | ((u64)0xFF<<
286a0 69 78 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ix8);.          
286b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
286c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
286d0 20 69 66 28 20 76 3d 3d 30 78 46 46 20 29 20 72   if( v==0xFF ) r
286e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
286f0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  Y;.            i
28700 66 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  f( (p->sharedMas
28710 6b 20 26 20 28 31 20 3c 3c 20 69 29 29 3d 3d 30  k & (1 << i))==0
28720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28730 20 20 6e 65 77 6d 61 73 6b 20 3d 20 6e 65 77 6d    newmask = newm
28740 61 73 6b 20 26 20 7e 28 28 75 36 34 29 30 78 46  ask & ~((u64)0xF
28750 46 3c 3c 69 78 38 29 20 7c 20 28 28 75 36 34 29  F<<ix8) | ((u64)
28760 28 76 2b 31 29 3c 3c 69 78 38 29 3b 0a 20 20 20  (v+1)<<ix8);.   
28770 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
28790 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
287a0 69 66 28 20 75 6e 69 78 43 6f 6d 70 61 72 65 41  if( unixCompareA
287b0 6e 64 53 77 61 70 28 26 70 53 68 6d 4e 6f 64 65  ndSwap(&pShmNode
287c0 2d 3e 6c 6f 63 6b 6d 61 73 6b 2c 20 6c 6f 63 6b  ->lockmask, lock
287d0 6d 61 73 6b 2c 20 6e 65 77 6d 61 73 6b 29 20 29  mask, newmask) )
287e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
287f0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
28800 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
28810 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
28820 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
28830 3b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  ;.      p->exclM
28840 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
28850 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
28860 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
28870 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
28880 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
28890 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65   mask;.    }else
288a0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
288b0 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
288c0 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
288d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
288e0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
288f0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
28900 68 6d 4e 6f 64 65 2d 3e 70 53 68 6d 4d 75 74 65  hmNode->pShmMute
28910 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
28920 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
28930 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
28940 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
28950 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
28960 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
28970 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
28980 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
28990 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
289a0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
289b0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
289c0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
289d0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
289e0 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
289f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
28a00 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
28a10 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
28a20 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
28a30 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
28a40 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
28a50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
28a60 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
28a70 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
28a80 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
28a90 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
28aa0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
28ab0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
28ac0 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  Fd, F_UNLCK, ofs
28ad0 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
28ae0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
28af0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28b00 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
28b10 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
28b20 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
28b30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28b40 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
28b50 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
28b60 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
28b70 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
28b80 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
28b90 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
28ba0 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
28bb0 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
28bc0 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
28bd0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
28be0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
28bf0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
28c00 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
28c10 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
28c20 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
28c30 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
28c40 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
28c50 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
28c60 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
28c70 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
28c80 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
28c90 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
28ca0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
28cb0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
28cc0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
28cd0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
28ce0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
28cf0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
28d00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
28d20 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
28d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
28d40 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
28d50 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
28d60 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
28d70 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
28d80 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
28d90 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
28da0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28db0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
28dc0 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
28dd0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
28de0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
28df0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
28e00 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
28e10 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
28e20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
28e30 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28e40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
28e50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
28e60 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
28e70 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
28e80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28e90 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
28ea0 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
28eb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
28ec0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
28ed0 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
28ee0 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
28ef0 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
28f00 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
28f10 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
28f20 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
28f30 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
28f40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
28f50 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
28f60 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
28f70 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
28f80 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
28f90 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
28fa0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
28fb0 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
28fc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28fd0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
28fe0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
28ff0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
29000 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
29010 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
29020 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
29030 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
29040 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
29050 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
29060 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
29070 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
29080 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29090 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
290a0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
290b0 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
290c0 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
290d0 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
290e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
290f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
29100 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
29110 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
29120 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
29130 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
29140 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29150 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
29160 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
29170 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20 4f  >pShmMutex);.  O
29180 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
29190 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
291a0 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
291b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
291c0 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69 64 28  p->id, osGetpid(
291d0 30 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  0), p->sharedMas
291e0 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29  k, p->exclMask))
291f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
29200 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
29210 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
29220 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
29230 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
29240 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ory.  .**.** All
29250 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65   loads and store
29260 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74  s begun before t
29270 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20  he barrier must 
29280 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a  complete before.
29290 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73  ** any load or s
292a0 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72  tore begun after
292b0 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f   the barrier..*/
292c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
292d0 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73  xShmBarrier(.  s
292e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29300 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
29310 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
29320 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
29330 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
29340 45 52 28 66 64 29 3b 0a 23 69 66 64 65 66 20 53  ER(fd);.#ifdef S
29350 51 4c 49 54 45 5f 4d 55 54 45 58 46 52 45 45 5f  QLITE_MUTEXFREE_
29360 53 48 4d 4c 4f 43 4b 0a 20 20 5f 5f 73 79 6e 63  SHMLOCK.  __sync
29370 5f 73 79 6e 63 68 72 6f 6e 69 7a 65 28 29 3b 0a  _synchronize();.
29380 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 4d  #else.  sqlite3M
29390 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20  emoryBarrier(); 
293a0 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69          /* compi
293b0 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f  ler-defined memo
293c0 72 79 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20  ry barrier */.  
293d0 61 73 73 65 72 74 28 20 66 64 2d 3e 70 4d 65 74  assert( fd->pMet
293e0 68 6f 64 73 2d 3e 78 4c 6f 63 6b 3d 3d 6e 6f 6c  hods->xLock==nol
293f0 6f 63 6b 4c 6f 63 6b 20 0a 20 20 20 20 20 20 20  ockLock .       
29400 7c 7c 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78  || unixFileMutex
29410 4e 6f 74 68 65 6c 64 28 28 75 6e 69 78 46 69 6c  Notheld((unixFil
29420 65 2a 29 66 64 29 20 0a 20 20 29 3b 0a 20 20 75  e*)fd) .  );.  u
29430 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
29440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29450 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f  * Also mutex, fo
29460 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a  r redundancy */.
29470 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
29480 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ();.#endif.}../*
29490 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
294a0 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
294b0 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
294c0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
294d0 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
294e0 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
294f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
29500 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d  e is no shared m
29510 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
29520 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63   with the connec
29530 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a  tion then this.*
29540 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  * routine is a h
29550 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
29560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
29570 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  xShmUnmap(.  sql
29580 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
295a0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
295b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
295c0 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
295d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295e0 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
295f0 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
29600 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
29610 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
29620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29630 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
29640 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
29650 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
29660 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
29670 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
29680 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
29690 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
296a0 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
296b0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
296c0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
296d0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
296e0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
296f0 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  DbFd;           
29700 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
29710 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
29720 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64  file */..  pDbFd
29730 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
29740 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
29750 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
29760 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
29770 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
29780 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
29790 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
297a0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
297b0 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
297c0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
297d0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
297e0 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  >pInode );..  /*
297f0 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
29800 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
29810 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
29820 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
29830 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
29840 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
29850 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
29860 2d 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 20 20  ->pShmMutex);.  
29870 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
29880 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
29890 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
298a0 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
298b0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
298c0 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
298d0 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
298e0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
298f0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
29900 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
29910 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
29920 3e 70 53 68 6d 4d 75 74 65 78 29 3b 0a 0a 20 20  >pShmMutex);..  
29930 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
29940 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
29950 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
29960 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
29970 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
29980 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
29990 61 73 73 65 72 74 28 20 75 6e 69 78 46 69 6c 65  assert( unixFile
299a0 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 44 62  MutexNotheld(pDb
299b0 46 64 29 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  Fd) );.  unixEnt
299c0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
299d0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
299e0 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
299f0 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
29a00 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
29a10 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f==0 ){.    if( 
29a20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53  deleteFlag && pS
29a30 68 6d 4e 6f 64 65 2d 3e 68 53 68 6d 3e 3d 30 20  hmNode->hShm>=0 
29a40 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
29a50 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  k(pShmNode->zFil
29a60 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
29a70 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
29a80 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  DbFd);.  }.  uni
29a90 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
29aa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29ab0 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20  OK;.}...#else.# 
29ac0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61  define unixShmMa
29ad0 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
29ae0 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20   unixShmLock    
29af0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
29b00 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
29b10 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61  fine unixShmUnma
29b20 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
29b30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29b40 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20  MIT_WAL */..#if 
29b50 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
29b60 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SIZE>0./*.** If 
29b70 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
29b80 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75  memory mapped, u
29b90 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a  nmap file pFd..*
29ba0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
29bb0 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
29bc0 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73  File *pFd){.  as
29bd0 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
29be0 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28  hOut==0 );.  if(
29bf0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
29c00 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70   ){.    osMunmap
29c10 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  (pFd->pMapRegion
29c20 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  , pFd->mmapSizeA
29c30 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d  ctual);.    pFd-
29c40 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
29c50 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
29c60 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d  ze = 0;.    pFd-
29c70 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
29c80 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
29c90 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
29ca0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
29cb0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
29cc0 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69  maintained by fi
29cd0 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  le .** descripto
29ce0 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79  r pFd to nNew by
29cf0 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e  tes. Any existin
29d00 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73  g mapping is dis
29d10 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  carded..**.** If
29d20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
29d30 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
29d40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
29d50 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  riables:.**.**  
29d60 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d       unixFile.pM
29d70 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20  apRegion.**     
29d80 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
29d90 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69  ize.**       uni
29da0 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63  xFile.mmapSizeAc
29db0 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e  tual.**.** If un
29dc0 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65  successful, an e
29dd0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
29de0 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69 74  logged via sqlit
29df0 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20  e3_log() and.** 
29e00 74 68 65 20 74 68 72 65 65 20 76 61 72 69 61 62  the three variab
29e10 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65  les above are ze
29e20 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  roed. In this ca
29e30 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  se SQLite should
29e40 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63  .** continue acc
29e50 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
29e60 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 78 52  ase using the xR
29e70 65 61 64 28 29 20 61 6e 64 20 78 57 72 69 74 65  ead() and xWrite
29e80 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a  ().** methods..*
29e90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
29ea0 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75  ixRemapfile(.  u
29eb0 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20  nixFile *pFd,   
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29ed0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
29ee0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  r object */.  i6
29ef0 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20  4 nNew          
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29f10 20 52 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e   Required mappin
29f20 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63  g size */.){.  c
29f30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
29f40 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20  = "mmap";.  int 
29f50 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20  h = pFd->h;     
29f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f70 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
29f80 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66  tor open on db f
29f90 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72  ile */.  u8 *pOr
29fa0 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e  ig = (u8 *)pFd->
29fb0 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a  pMapRegion;   /*
29fc0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
29fd0 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  ent file mapping
29fe0 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20   */.  i64 nOrig 
29ff0 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  = pFd->mmapSizeA
2a000 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69  ctual;     /* Si
2a010 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69  ze of pOrig regi
2a020 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  on in bytes */. 
2a030 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20   u8 *pNew = 0;  
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a050 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
2a060 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67  n of new mapping
2a070 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
2a080 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20  = PROT_READ;    
2a090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2a0a0 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d  ags to pass to m
2a0b0 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65  map() */..  asse
2a0c0 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
2a0d0 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ut==0 );.  asser
2a0e0 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61  t( nNew>pFd->mma
2a0f0 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  pSize );.  asser
2a100 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d  t( nNew<=pFd->mm
2a110 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61  apSizeMax );.  a
2a120 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
2a130 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
2a140 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d  mmapSizeActual>=
2a150 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b  pFd->mmapSize );
2a160 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46  .  assert( MAP_F
2a170 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66  AILED!=0 );..#if
2a180 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f  def SQLITE_MMAP_
2a190 52 45 41 44 57 52 49 54 45 0a 20 20 69 66 28 20  READWRITE.  if( 
2a1a0 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
2a1b0 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
2a1c0 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d  Y)==0 ) flags |=
2a1d0 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e   PROT_WRITE;.#en
2a1e0 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72 69 67  dif..  if( pOrig
2a1f0 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45   ){.#if HAVE_MRE
2a200 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75  MAP.    i64 nReu
2a210 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  se = pFd->mmapSi
2a220 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f  ze;.#else.    co
2a230 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67  nst int szSyspag
2a240 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a  e = osGetpagesiz
2a250 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65  e();.    i64 nRe
2a260 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70  use = (pFd->mmap
2a270 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61  Size & ~(szSyspa
2a280 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20  ge-1));.#endif. 
2a290 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70     u8 *pReq = &p
2a2a0 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20  Orig[nReuse];.. 
2a2b0 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20     /* Unmap any 
2a2c0 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69  pages of the exi
2a2d0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68  sting mapping th
2a2e0 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75  at cannot be reu
2a2f0 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  sed. */.    if( 
2a300 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b  nReuse!=nOrig ){
2a310 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
2a320 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75  pReq, nOrig-nReu
2a330 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
2a340 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20  HAVE_MREMAP.    
2a350 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28  pNew = osMremap(
2a360 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e  pOrig, nReuse, n
2a370 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d  New, MREMAP_MAYM
2a380 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d  OVE);.    zErr =
2a390 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65   "mremap";.#else
2a3a0 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d  .    pNew = osMm
2a3b0 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52  ap(pReq, nNew-nR
2a3c0 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50  euse, flags, MAP
2a3d0 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75  _SHARED, h, nReu
2a3e0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  se);.    if( pNe
2a3f0 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w!=MAP_FAILED ){
2a400 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21  .      if( pNew!
2a410 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20  =pReq ){.       
2a420 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20   osMunmap(pNew, 
2a430 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a  nNew - nReuse);.
2a440 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30          pNew = 0
2a450 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a460 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f         pNew = pO
2a470 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rig;.      }.   
2a480 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2a490 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f  * The attempt to
2a4a0 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73   extend the exis
2a4b0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69  ting mapping fai
2a4c0 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f  led. Free it. */
2a4d0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  .    if( pNew==M
2a4e0 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65  AP_FAILED || pNe
2a4f0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  w==0 ){.      os
2a500 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Munmap(pOrig, nR
2a510 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  euse);.    }.  }
2a520 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69  ..  /* If pNew i
2a530 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72  s still NULL, tr
2a540 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65  y to create an e
2a550 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70  ntirely new mapp
2a560 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e  ing. */.  if( pN
2a570 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ew==0 ){.    pNe
2a580 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e  w = osMmap(0, nN
2a590 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  ew, flags, MAP_S
2a5a0 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20  HARED, h, 0);.  
2a5b0 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  }..  if( pNew==M
2a5c0 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
2a5d0 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e   pNew = 0;.    n
2a5e0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69  New = 0;.    uni
2a5f0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2a600 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e  _OK, zErr, pFd->
2a610 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20  zPath);..    /* 
2a620 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62  If the mmap() ab
2a630 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75  ove failed, assu
2a640 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  me that all subs
2a650 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61  equent mmap() ca
2a660 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  lls.    ** will 
2a670 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f  probably fail to
2a680 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20  o. Fall back to 
2a690 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
2a6a0 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20  te exclusively. 
2a6b0 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
2a6c0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d  se.  */.    pFd-
2a6d0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30  >mmapSizeMax = 0
2a6e0 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61  ;.  }.  pFd->pMa
2a6f0 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20  pRegion = (void 
2a700 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d  *)pNew;.  pFd->m
2a710 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d  mapSize = pFd->m
2a720 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
2a730 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  nNew;.}../*.** M
2a740 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d  emory map or rem
2a750 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  ap the file open
2a760 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72  ed by file-descr
2a770 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68  iptor pFd (if th
2a780 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72  e file.** is alr
2a790 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65  eady mapped, the
2a7a0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
2a7b0 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  g is replaced by
2a7c0 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69   the new). Or, i
2a7d0 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65  f .** there alre
2a7e0 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70  ady exists a map
2a7f0 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69  ping for this fi
2a800 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
2a810 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73  e still .** outs
2a820 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
2a830 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
2a840 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
2a850 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2a860 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
2a870 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
2a880 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
2a890 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
2a8a0 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  size of .** the 
2a8b0 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74  mapping to creat
2a8c0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
2a8d0 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74   nByte is less t
2a8e0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
2a8f0 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
2a900 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a   size is the siz
2a910 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
2a920 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61   disk. The actua
2a930 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  l size of the.**
2a940 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67   created mapping
2a950 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72   is either the r
2a960 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72  equested size or
2a970 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69   the value confi
2a980 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20  gured .** using 
2a990 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
2a9a0 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76  P_LIMIT, whichev
2a9b0 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
2a9c0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2a9d0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
2a9e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
2a9f0 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
2aa00 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
2aa10 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
2aa20 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
2aa30 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
2aa40 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2aa50 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
2aa60 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
2aa70 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e  t unixMapfile(un
2aa80 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34  ixFile *pFd, i64
2aa90 20 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65 72 74   nMap){.  assert
2aaa0 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64  ( nMap>=0 || pFd
2aab0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
2aac0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ;.  assert( nMap
2aad0 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70  >0 || (pFd->mmap
2aae0 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e  Size==0 && pFd->
2aaf0 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29  pMapRegion==0) )
2ab00 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65  ;.  if( pFd->nFe
2ab10 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72  tchOut>0 ) retur
2ab20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
2ab30 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20  if( nMap<0 ){.  
2ab40 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
2ab50 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
2ab60 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
2ab70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
2ab80 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
2ab90 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75  (pFd->h, &statbu
2aba0 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
2abb0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2abc0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20  FSTAT;.    }.   
2abd0 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e   nMap = statbuf.
2abe0 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  st_size;.  }.  i
2abf0 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61  f( nMap>pFd->mma
2ac00 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20  pSizeMax ){.    
2ac10 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  nMap = pFd->mmap
2ac20 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20  SizeMax;.  }..  
2ac30 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c  assert( nMap>0 |
2ac40 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  | (pFd->mmapSize
2ac50 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70  ==0 && pFd->pMap
2ac60 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20  Region==0) );.  
2ac70 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d  if( nMap!=pFd->m
2ac80 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 75  mapSize ){.    u
2ac90 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64  nixRemapfile(pFd
2aca0 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20  , nMap);.  }..  
2acb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2acc0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2acd0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
2ace0 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ZE>0 */../*.** I
2acf0 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75  f possible, retu
2ad00 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2ad10 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  a mapping of fil
2ad20 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74  e fd starting at
2ad30 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e   offset.** iOff.
2ad40 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73   The mapping mus
2ad50 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61  t be valid for a
2ad60 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74  t least nAmt byt
2ad70 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  es..**.** If suc
2ad80 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20  h a pointer can 
2ad90 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f  be obtained, sto
2ada0 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64  re it in *pp and
2adb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2adc0 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65  K..** Or, if one
2add0 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65   cannot but no e
2ade0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
2adf0 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65   *pp to 0 and re
2ae00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
2ae10 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61  ** Finally, if a
2ae20 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
2ae30 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
2ae40 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
2ae50 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61   The final.** va
2ae60 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e  lue of *pp is un
2ae70 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
2ae80 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
2ae90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2aea0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
2aeb0 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  er, the caller m
2aec0 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  ust eventually .
2aed0 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
2aee0 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
2aef0 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28  ing unixUnfetch(
2af00 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
2af10 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74   unixFetch(sqlit
2af20 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
2af30 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
2af40 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
2af50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
2af60 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
2af70 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
2af80 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
2af90 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
2afa0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
2afb0 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
2afc0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
2afd0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
2afe0 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
2aff0 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
2b000 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
2b010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
2b020 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
2b030 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
2b040 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b050 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2b060 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2b070 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
2b080 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
2b090 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
2b0a0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
2b0b0 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
2b0c0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
2b0d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2b0e0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
2b0f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
2b100 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
2b110 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
2b120 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2b130 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20  tion releases a 
2b140 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62  .** reference ob
2b150 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72  tained by an ear
2b160 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69  lier call to uni
2b170 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65  xFetch(). The se
2b180 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
2b190 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
2b1a0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
2b1b0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2b1c0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
2b1d0 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  * argument that 
2b1e0 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
2b1f0 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e  e unixFetch() in
2b200 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
2b210 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
2b220 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
2b230 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
2b240 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
2b250 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
2b260 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
2b270 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
2b280 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
2b290 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
2b2a0 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
2b2b0 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
2b2c0 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
2b2d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2b2e0 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74  nixUnfetch(sqlit
2b2f0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
2b300 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
2b310 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
2b320 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
2b330 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
2b340 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
2b350 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
2b360 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
2b370 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
2b380 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20  METER(iOff);..  
2b390 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
2b3a0 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
2b3b0 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
2b3c0 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
2b3d0 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63  ding .  ** xFetc
2b3e0 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
2b3f0 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
2b400 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
2b410 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
2b420 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
2b430 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
2b440 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
2b450 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
2b460 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
2b470 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
2b480 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
2b490 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
2b4a0 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
2b4b0 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
2b4c0 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
2b4d0 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
2b4e0 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  ] );..  if( p ){
2b4f0 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
2b500 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
2b510 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
2b520 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
2b530 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
2b540 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73  chOut>=0 );.#els
2b550 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
2b560 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
2b570 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
2b580 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b590 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69  TER(iOff);.#endi
2b5a0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
2b5b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
2b5c0 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
2b5d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
2b5e0 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
2b5f0 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
2b600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b610 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
2b620 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
2b630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2b650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
2b6a0 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
2b6b0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
2b6c0 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
2b6d0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2b6e0 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
2b6f0 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
2b700 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
2b710 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
2b720 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
2b730 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
2b740 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
2b750 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
2b760 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
2b770 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
2b780 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
2b790 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2b7a0 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
2b7b0 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
2b7c0 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
2b7d0 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
2b7e0 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
2b7f0 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
2b800 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
2b810 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
2b820 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
2b830 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
2b840 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
2b850 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
2b860 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
2b870 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
2b880 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2b890 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
2b8a0 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
2b8b0 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
2b8c0 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
2b8d0 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
2b8e0 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
2b8f0 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
2b900 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
2b910 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
2b920 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
2b930 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
2b940 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  r finder-functio
2b950 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
2b960 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
2b970 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
2b980 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
2b990 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
2b9a0 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
2b9b0 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
2b9c0 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
2b9d0 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
2b9e0 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
2b9f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2ba00 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
2ba10 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
2ba20 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
2ba30 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
2ba40 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
2ba50 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
2ba60 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
2ba70 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
2ba80 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
2ba90 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
2baa0 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
2bab0 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
2bac0 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
2bad0 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
2bae0 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
2baf0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
2bb00 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
2bb10 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
2bb20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
2bb30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2bb40 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
2bb50 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
2bb60 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
2bb70 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
2bb80 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
2bb90 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
2bba0 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
2bbb0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
2bbc0 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
2bbd0 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
2bbe0 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
2bbf0 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
2bc00 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
2bc10 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
2bc20 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
2bc30 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52  INDER,METHOD,VER
2bc40 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c  SION,CLOSE,LOCK,
2bc50 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48  UNLOCK,CKLOCK,SH
2bc60 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74  MMAP)     \.stat
2bc70 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2bc80 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
2bc90 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
2bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcb0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
2bcc0 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
2bcd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
2bce0 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd00 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
2bd10 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
2bd20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2bd30 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
2bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd50 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2bd60 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
2bd70 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
2bd80 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bda0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
2bdb0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
2bdc0 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
2bdd0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdf0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
2be00 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
2be10 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
2be20 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
2be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be40 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
2be50 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2be60 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
2be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be90 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
2bea0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
2beb0 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
2bec0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bee0 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
2bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf00 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf30 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
2bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf50 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
2bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf80 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
2bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfa0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2bfb0 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2bfd0 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
2bfe0 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
2bff0 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
2c000 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2c020 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
2c030 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
2c040 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
2c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c060 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2c070 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
2c080 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
2c090 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
2c0a0 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
2c0b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2c0c0 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20   SHMMAP,        
2c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c0e0 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
2c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c100 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2c110 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
2c120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c130 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
2c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c150 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2c160 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
2c170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2c180 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
2c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1a0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2c1b0 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  ixShmUnmap,     
2c1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2c1d0 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
2c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1f0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2c200 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  xFetch,         
2c210 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
2c220 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c240 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2c250 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20  Unfetch,        
2c260 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
2c270 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c290 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20        \.};      
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
2c2f0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2c300 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23  ethods *FINDER##
2c310 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  Impl(const char 
2c320 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29  *z, unixFile *p)
2c330 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50  {   \.  UNUSED_P
2c340 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55  ARAMETER(z); UNU
2c350 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
2c360 3b 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 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d     \.  return &M
2c390 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20  ETHOD;          
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20                  
2c3d0 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20    \.}           
2c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20                  
2c420 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
2c430 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2c440 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44  ds *(*const FIND
2c450 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ER)(const char*,
2c460 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20  unixFile *p)    
2c470 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23  \.    = FINDER##
2c480 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  Impl;../*.** Her
2c490 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65  e are all of the
2c4a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2c4b0 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ods objects for 
2c4c0 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  each of the.** l
2c4d0 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
2c4e0 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68  s.  Functions th
2c4f0 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  at return pointe
2c500 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68  rs to these meth
2c510 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ods.** are also 
2c520 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45  created..*/.IOME
2c530 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f  THODS(.  posixIo
2c540 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2c550 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2c560 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2c570 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20  posixIoMethods, 
2c580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2c590 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c5a0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2c5b0 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
2c5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2c5d0 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20  ared memory and 
2c5e0 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64  mmap are enabled
2c5f0 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
2c600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c610 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2c620 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c640 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2c650 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
2c660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c670 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2c680 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
2c690 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2c6a0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2c6b0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2c6c0 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20    unixShmMap    
2c6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c6e0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2c6f0 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
2c700 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  nolockIoFinder, 
2c710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2c720 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2c730 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d  e */.  nolockIoM
2c740 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2c750 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2c760 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2c770 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20  me */.  3,      
2c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c790 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2c7a0 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20  ry and mmap are 
2c7b0 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c  enabled */.  nol
2c7c0 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
2c7d0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2c7e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
2c7f0 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
2c800 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2c810 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
2c820 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
2c830 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2c840 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
2c850 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
2c860 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68 65 63 6b  Lock,  /* xCheck
2c870 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2c880 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8a0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2c8b0 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
2c8c0 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  ODS(.  dotlockIo
2c8d0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2c8e0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2c8f0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f  ion name */.  do
2c900 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  tlockIoMethods, 
2c910 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2c920 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2c930 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2c940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c950 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2c960 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2c970 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  abled */.  dotlo
2c980 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
2c990 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2c9a0 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
2c9b0 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
2c9c0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2c9d0 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
2c9e0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
2c9f0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2ca00 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
2ca10 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
2ca20 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63 6b 52 65  ock, /* xCheckRe
2ca30 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2ca40 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca60 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2ca70 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c  od */.)..#if SQL
2ca80 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2ca90 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
2caa0 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
2cab0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
2cac0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
2cad0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
2cae0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
2caf0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2cb00 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2cb10 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
2cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb30 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
2cb40 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
2cb50 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  bled */.  flockC
2cb60 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2cb70 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
2cb80 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
2cb90 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2cba0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
2cbb0 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
2cbc0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2cbd0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
2cbe0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
2cbf0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2cc00 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ,   /* xCheckRes
2cc10 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
2cc20 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
2cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc40 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
2cc50 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
2cc60 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
2cc70 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
2cc80 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2cc90 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2cca0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2ccb0 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
2ccc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2ccd0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2cce0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2ccf0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cd10 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2cd20 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
2cd30 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  emXClose,       
2cd40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2cd50 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
2cd60 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  emXLock,        
2cd70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2cd80 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
2cd90 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  mXUnlock,       
2cda0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
2cdb0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
2cdc0 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65 64  emXCheckReserved
2cdd0 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65  Lock,    /* xChe
2cde0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2cdf0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce10 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
2ce20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
2ce30 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
2ce40 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2ce50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2ce60 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
2ce70 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64  ODS(.  afpIoFind
2ce80 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
2ce90 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2cea0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66  ion name */.  af
2ceb0 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  pIoMethods,     
2cec0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2ced0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2cee0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2cef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2cf00 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2cf10 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2cf20 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c  abled */.  afpCl
2cf30 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2cf40 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2cf50 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f  ethod */.  afpLo
2cf60 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2cf70 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2cf80 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c  thod */.  afpUnl
2cf90 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2cfa0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2cfb0 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68  ethod */.  afpCh
2cfc0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2cfd0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
2cfe0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2cff0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d010 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2d020 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2d030 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
2d040 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
2d050 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
2d060 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
2d070 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
2d080 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
2d090 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
2d0a0 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
2d0b0 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
2d0c0 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
2d0d0 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
2d0e0 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
2d0f0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
2d100 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
2d110 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
2d120 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
2d130 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
2d140 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
2d150 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
2d160 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
2d170 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
2d180 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
2d190 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
2d1a0 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
2d1b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
2d1c0 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
2d1d0 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
2d1e0 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
2d1f0 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
2d200 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
2d210 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
2d220 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2d230 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2d240 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
2d250 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2d260 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
2d270 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
2d280 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
2d290 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
2d2a0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
2d2b0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
2d2c0 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
2d2d0 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
2d2e0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
2d2f0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
2d300 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
2d310 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
2d320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2d330 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2d340 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
2d350 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2d360 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2d370 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2d380 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3a0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2d3b0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2d3c0 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20  /.  proxyClose, 
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d3e0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2d3f0 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20  /.  proxyLock,  
2d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d410 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2d420 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20  .  proxyUnlock, 
2d430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d440 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2d450 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65  /.  proxyCheckRe
2d460 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a  servedLock,   /*
2d470 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2d480 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2d490 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2d4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2d4b0 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2d4c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20  .#endif../* nfs 
2d4d0 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e  lockd on OSX 10.
2d4e0 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72  3+ doesn't clear
2d4f0 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65   write locks whe
2d500 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
2d510 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69   set */.#if defi
2d520 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2d530 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2d540 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
2d550 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f  METHODS(.  nfsIo
2d560 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2d570 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2d580 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2d590 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c  .  nfsIoMethods,
2d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d5b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2d5c0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2d5d0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5f0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2d600 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2d610 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
2d620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d630 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2d640 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
2d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d660 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2d670 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20  .  nfsUnlock,   
2d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d690 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2d6a0 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
2d6b0 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
2d6c0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2d6d0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2d6e0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d700 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2d710 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
2d720 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2d730 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2d740 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2d750 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
2d760 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
2d770 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
2d780 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
2d790 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
2d7a0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
2d7b0 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
2d7c0 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
2d7d0 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
2d7e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
2d7f0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
2d800 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
2d810 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
2d820 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
2d830 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
2d840 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2d850 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
2d860 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
2d870 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
2d880 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
2d890 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2d8a0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
2d8b0 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
2d8c0 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69        /* open fi
2d8d0 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
2d8e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d8f0 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
2d900 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70  onst struct Mapp
2d910 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ing {.    const 
2d920 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65  char *zFilesyste
2d930 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2d940 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79  /* Filesystem ty
2d950 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  pe name */.    c
2d960 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2d970 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
2d980 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69  s;   /* Appropri
2d990 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ate locking meth
2d9a0 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d  od */.  } aMap[]
2d9b0 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22   = {.    { "hfs"
2d9c0 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
2d9d0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75  hods },.    { "u
2d9e0 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
2d9f0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2da00 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49   "afpfs",  &afpI
2da10 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2da20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70  { "smbfs",  &afp
2da30 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2da40 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f   { "webdav", &no
2da50 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  lockIoMethods },
2da60 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20  .    { 0, 0 }.  
2da70 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
2da80 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
2da90 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  fo;.  struct flo
2daa0 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
2dab0 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
2dac0 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
2dad0 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
2dae0 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
2daf0 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
2db00 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
2db10 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
2db20 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
2db30 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
2db40 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2db50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
2db60 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73  fs(filePath, &fs
2db70 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20  Info) != -1 ){. 
2db80 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f     if( fsInfo.f_
2db90 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e  flags & MNT_RDON
2dba0 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LY ){.      retu
2dbb0 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2dbc0 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ods;.    }.    f
2dbd0 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e  or(i=0; aMap[i].
2dbe0 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b  zFilesystem; i++
2dbf0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
2dc00 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
2dc10 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  ypename, aMap[i]
2dc20 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30  .zFilesystem)==0
2dc30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2dc40 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68  rn aMap[i].pMeth
2dc50 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ods;.      }.   
2dc60 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
2dc70 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
2dc80 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
2dc90 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20  rs, "nfs"..  ** 
2dca0 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  Test byte-range 
2dcb0 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
2dcc0 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20  (). If the call 
2dcd0 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20  succeeds, .  ** 
2dce0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
2dcf0 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
2dd00 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65  orts POSIX style
2dd10 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20   locks. .  */.  
2dd20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
2dd30 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
2dd40 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
2dd50 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
2dd60 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
2dd70 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
2dd80 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
2dd90 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
2dda0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
2ddb0 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
2ddc0 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2ddd0 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2dde0 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "nfs")==0 ){.   
2ddf0 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f     return &nfsIo
2de00 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65  Methods;.    } e
2de10 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lse {.      retu
2de20 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
2de30 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ds;.    }.  }els
2de40 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64  e{.    return &d
2de50 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  otlockIoMethods;
2de60 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
2de70 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2de80 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
2de90 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
2dea0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
2deb0 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
2dec0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
2ded0 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  pl;..#endif /* d
2dee0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2def0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2df00 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2df10 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f   */..#if OS_VXWO
2df20 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 22  RKS./*.** This "
2df30 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
2df40 20 66 6f 72 20 56 78 57 6f 72 6b 73 20 63 68 65   for VxWorks che
2df50 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70 6f  cks to see if po
2df60 73 69 78 20 61 64 76 69 73 6f 72 79 0a 2a 2a 20  six advisory.** 
2df70 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 2e 20 20  locking works.  
2df80 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e  If it does, then
2df90 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69 73   that is what is
2dfa0 20 75 73 65 64 2e 20 20 49 66 20 69 74 20 64 6f   used.  If it do
2dfb0 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20  es not.** work, 
2dfc0 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b 20 74 6f  then fallback to
2dfd0 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
2dfe0 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61   locking..*/.sta
2dff0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2e000 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 76 78  3_io_methods *vx
2e010 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70  worksIoFinderImp
2e020 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
2e030 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
2e040 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2e050 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2e060 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
2e070 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
2e080 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2e090 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2e0a0 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
2e0b0 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
2e0c0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
2e0d0 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
2e0e0 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
2e0f0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
2e100 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
2e110 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
2e120 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
2e130 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
2e140 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2e150 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ods;.  }..  /* T
2e160 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69  est if fcntl() i
2e170 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20  s supported and 
2e180 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20  use POSIX style 
2e190 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65  locks..  ** Othe
2e1a0 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20  rwise fall back 
2e1b0 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  to the named sem
2e1c0 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20  aphore method.. 
2e1d0 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
2e1e0 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
2e1f0 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
2e200 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
2e210 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
2e220 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
2e230 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
2e240 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
2e250 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
2e260 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
2e270 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f  {.    return &po
2e280 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
2e290 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2e2a0 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b  n &semIoMethods;
2e2b0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
2e2c0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2e2d0 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
2e2e0 73 74 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64  st vxworksIoFind
2e2f0 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
2e300 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 76 78 77  unixFile*) = vxw
2e310 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c  orksIoFinderImpl
2e320 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  ;..#endif /* OS_
2e330 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a  VXWORKS */../*.*
2e340 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79  * An abstract ty
2e350 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72  pe for a pointer
2e360 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68 6f 64   to an IO method
2e370 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
2e380 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e  :.*/.typedef con
2e390 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2e3a0 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f  thods *(*finder_
2e3b0 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72  type)(const char
2e3c0 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a  *,unixFile*);...
2e3d0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2e3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2e420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
2e440 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
2e450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
2e470 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
2e480 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
2e490 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
2e4a0 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
2e4b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
2e4c0 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ect..*/../*.** I
2e4d0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
2e4e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e  ntents of the un
2e4f0 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2e500 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
2e510 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  Id..*/.static in
2e520 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  t fillInUnixFile
2e530 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2e540 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50  *pVfs,      /* P
2e550 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
2e560 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  ject */.  int h,
2e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e580 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
2e590 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
2e5a0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
2e5b0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
2e5c0 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
2e5d0 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
2e5e0 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
2e5f0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
2e600 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2e610 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2e620 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2e630 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  d */.  int ctrlF
2e640 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
2e650 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55  * Zero or more U
2e660 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73  NIXFILE_* values
2e670 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
2e680 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2e690 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
2e6a0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
2e6b0 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
2e6c0 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
2e6d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2e6e0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
2e6f0 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
2e700 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63  /* No locking oc
2e710 63 75 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  curs in temporar
2e720 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73  y files */.  ass
2e730 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
2e740 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20  0 || (ctrlFlags 
2e750 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  & UNIXFILE_NOLOC
2e760 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52  K)!=0 );..  OSTR
2e770 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d  ACE(("OPEN    %-
2e780 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69  3d %s\n", h, zFi
2e790 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77  lename));.  pNew
2e7a0 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d  ->h = h;.  pNew-
2e7b0 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
2e7c0 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46  pNew->zPath = zF
2e7d0 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d  ilename;.  pNew-
2e7e0 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38  >ctrlFlags = (u8
2e7f0 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20  )ctrlFlags;.#if 
2e800 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
2e810 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d  SIZE>0.  pNew->m
2e820 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c  mapSizeMax = sql
2e830 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2e840 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a  .szMmap;.#endif.
2e850 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
2e860 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c  i_boolean(((ctrl
2e870 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2e880 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d  _URI) ? zFilenam
2e890 65 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20  e : 0),.        
2e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8b0 20 20 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54     "psow", SQLIT
2e8c0 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  E_POWERSAFE_OVER
2e8d0 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e  WRITE) ){.    pN
2e8e0 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
2e8f0 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a   UNIXFILE_PSOW;.
2e900 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70    }.  if( strcmp
2e910 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e  (pVfs->zName,"un
2e920 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a  ix-excl")==0 ){.
2e930 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2e940 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2e950 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  EXCL;.  }..#if O
2e960 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77  S_VXWORKS.  pNew
2e970 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46  ->pId = vxworksF
2e980 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e  indFileId(zFilen
2e990 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ame);.  if( pNew
2e9a0 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pId==0 ){.    
2e9b0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2e9c0 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20  XFILE_NOLOCK;.  
2e9d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2e9e0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  MEM_BKPT;.  }.#e
2e9f0 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c  ndif..  if( ctrl
2ea00 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2ea10 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _NOLOCK ){.    p
2ea20 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26  LockingStyle = &
2ea30 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2ea40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
2ea50 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a  ockingStyle = (*
2ea60 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70  *(finder_type*)p
2ea70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a  Vfs->pAppData)(z
2ea80 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b  Filename, pNew);
2ea90 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2eaa0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2eab0 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46  .    /* Cache zF
2eac0 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c  ilename in the l
2ead0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28  ocking context (
2eae0 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20  AFP and dotlock 
2eaf0 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20  override) for.  
2eb00 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61    ** proxyLock a
2eb10 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73  ctivation is pos
2eb20 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72  sible (remote pr
2eb30 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20  oxy is based on 
2eb40 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20  db name).    ** 
2eb50 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e  zFilename remain
2eb60 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69  s valid until fi
2eb70 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f  le is closed, to
2eb80 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20   support */.    
2eb90 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2eba0 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46  text = (void*)zF
2ebb0 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ilename;.#endif.
2ebc0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b    }..  if( pLock
2ebd0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73  ingStyle == &pos
2ebe0 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20  ixIoMethods.#if 
2ebf0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2ec00 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2ec10 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2ec20 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e  E.    || pLockin
2ec30 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f  gStyle == &nfsIo
2ec40 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20  Methods.#endif. 
2ec50 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   ){.    unixEnte
2ec60 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
2ec70 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2ec80 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2ec90 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  node);.    if( r
2eca0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ecb0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65        /* If an e
2ecc0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
2ecd0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2ece0 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
2ecf0 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
2ed00 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
2ed10 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
2ed20 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
2ed30 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61  ndInodeInfo() ma
2ed40 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20  y fail.      ** 
2ed50 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
2ed60 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
2ed70 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c   **   (a) A call
2ed80 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c   to fstat() fail
2ed90 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  ed..      **   (
2eda0 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  b) A malloc fail
2edb0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2edc0 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28     ** Scenario (
2edd0 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  b) may only occu
2ede0 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  r if the process
2edf0 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f   is holding no o
2ee00 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69  ther.      ** fi
2ee10 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
2ee20 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2ee30 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77  file. If there w
2ee40 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20  ere other file. 
2ee50 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
2ee60 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ors on this file
2ee70 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63  , then no malloc
2ee80 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72   would be requir
2ee90 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66  ed by.      ** f
2eea0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20  indInodeInfo(). 
2eeb0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
2eec0 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
2eed0 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
2eee0 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
2eef0 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
2ef00 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
2ef10 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
2ef20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
2ef30 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
2ef40 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2ef50 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
2ef60 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
2ef70 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
2ef80 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
2ef90 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
2efa0 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
2efb0 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
2efc0 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
2efd0 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
2efe0 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
2eff0 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
2f000 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
2f010 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
2f020 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
2f030 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  /.      robust_c
2f040 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2f050 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68  LINE__);.      h
2f060 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2f070 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2f080 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
2f090 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2f0a0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2f0b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
2f0c0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2f0d0 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
2f0e0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2f0f0 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
2f100 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2f110 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2f120 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
2f130 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
2f140 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
2f150 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
2f160 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
2f170 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2f180 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
2f190 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2f1a0 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  c64( sizeof(*pCt
2f1b0 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  x) );.    if( pC
2f1c0 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  tx==0 ){.      r
2f1d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2f1e0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
2f1f0 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a  {.      /* NB: z
2f200 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20  Filename exists 
2f210 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  and remains vali
2f220 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65  d until the file
2f230 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20   is closed.     
2f240 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   ** according to
2f250 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31   requirement F11
2f260 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  141.  So we do n
2f270 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
2f280 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
2f290 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e  of the filename.
2f2a0 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   */.      pCtx->
2f2b0 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  dbPath = zFilena
2f2c0 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  me;.      pCtx->
2f2d0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
2f2e0 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
2f2f0 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65  ;.      unixEnte
2f300 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  rMutex();.      
2f310 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2f320 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2f330 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  pInode);.      i
2f340 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f350 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f360 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
2f370 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
2f380 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
2f390 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2f3a0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
2f3b0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d   h = -1;.      }
2f3c0 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65  .      unixLeave
2f3d0 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20  Mutex();        
2f3e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2f3f0 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  f..  else if( pL
2f400 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2f410 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
2f420 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69   ){.    /* Dotfi
2f430 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  le locking uses 
2f440 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2f450 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
2f460 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
2f470 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f  ** the dotlockLo
2f480 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20  ckingContext .  
2f490 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
2f4a0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e  LockFile;.    in
2f4b0 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  t nFilename;.   
2f4c0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2f4d0 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69  me!=0 );.    nFi
2f4e0 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74  lename = (int)st
2f4f0 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20  rlen(zFilename) 
2f500 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69  + 6;.    zLockFi
2f510 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  le = (char *)sql
2f520 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46  ite3_malloc64(nF
2f530 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
2f540 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29  ( zLockFile==0 )
2f550 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2f560 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2f570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f580 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2f590 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f  f(nFilename, zLo
2f5a0 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54  ckFile, "%s" DOT
2f5b0 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69  LOCK_SUFFIX, zFi
2f5c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  lename);.    }. 
2f5d0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2f5e0 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46  Context = zLockF
2f5f0 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  ile;.  }..#if OS
2f600 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20  _VXWORKS.  else 
2f610 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2f620 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f  e == &semIoMetho
2f630 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d  ds ){.    /* Nam
2f640 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
2f650 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2f660 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2f670 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
2f680 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
2f690 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   semLockingConte
2f6a0 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  xt.    */.    un
2f6b0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2f6c0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2f6d0 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2f6e0 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2f6f0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
2f700 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70  _OK) && (pNew->p
2f710 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c  Inode->pSem==NUL
2f720 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  L) ){.      char
2f730 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65   *zSemName = pNe
2f740 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2f750 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
2f760 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2f770 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
2f780 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
2f790 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20   "/%s.sem",.    
2f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7b0 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43     pNew->pId->zC
2f7c0 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
2f7d0 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a       for( n=1; z
2f7e0 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20  SemName[n]; n++ 
2f7f0 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  ).        if( zS
2f800 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29  emName[n]=='/' )
2f810 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27   zSemName[n] = '
2f820 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  _';.      pNew->
2f830 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73  pInode->pSem = s
2f840 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65  em_open(zSemName
2f850 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c  , O_CREAT, 0666,
2f860 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
2f870 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2f880 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20  m == SEM_FAILED 
2f890 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2f8a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2f8b0 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  T;.        pNew-
2f8c0 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
2f8d0 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
2f8e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
2f8f0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2f900 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
2f910 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
2f920 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53  pNew, 0);.#if OS
2f930 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
2f940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f950 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
2f960 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2f970 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2f980 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2f990 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61  osUnlink(zFilena
2f9a0 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  me);.    pNew->c
2f9b0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2f9c0 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d  FILE_DELETE;.  }
2f9d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
2f9e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f9f0 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
2fa00 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2fa10 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2fa20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
2fa30 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63  ->pMethod = pLoc
2fa40 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f  kingStyle;.    O
2fa50 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
2fa60 20 20 20 20 76 65 72 69 66 79 44 62 46 69 6c 65      verifyDbFile
2fa70 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65  (pNew);.  }.  re
2fa80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2fa90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
2faa0 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
2fab0 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74   in which to put
2fac0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
2fad0 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  ..** If no suita
2fae0 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ble temporary fi
2faf0 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e  le directory can
2fb00 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
2fb10 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
2fb20 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
2fb30 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f  ixTempFileDir(vo
2fb40 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
2fb50 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
2fb60 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20  [] = {.     0,. 
2fb70 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61      0,.     "/va
2fb80 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
2fb90 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
2fba0 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a 20  tmp",.     ".". 
2fbb0 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
2fbc0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 73 74 72 75  nt i = 0;.  stru
2fbd0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63  ct stat buf;.  c
2fbe0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
2fbf0 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  = sqlite3_temp_d
2fc00 69 72 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28  irectory;..  if(
2fc10 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a   !azDirs[0] ) az
2fc20 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76  Dirs[0] = getenv
2fc30 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22  ("SQLITE_TMPDIR"
2fc40 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  );.  if( !azDirs
2fc50 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20  [1] ) azDirs[1] 
2fc60 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
2fc70 22 29 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  ");.  while(1){.
2fc80 20 20 20 20 69 66 28 20 7a 44 69 72 21 3d 30 0a      if( zDir!=0.
2fc90 20 20 20 20 20 26 26 20 6f 73 53 74 61 74 28 7a       && osStat(z
2fca0 44 69 72 2c 20 26 62 75 66 29 3d 3d 30 0a 20 20  Dir, &buf)==0.  
2fcb0 20 20 20 26 26 20 53 5f 49 53 44 49 52 28 62 75     && S_ISDIR(bu
2fcc0 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20  f.st_mode).     
2fcd0 26 26 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72  && osAccess(zDir
2fce0 2c 20 30 33 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  , 03)==0.    ){.
2fcf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 7a 44 69        return zDi
2fd00 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
2fd10 20 69 3e 3d 73 69 7a 65 6f 66 28 61 7a 44 69 72   i>=sizeof(azDir
2fd20 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
2fd30 5b 30 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  [0]) ) break;.  
2fd40 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b    zDir = azDirs[
2fd50 69 2b 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  i++];.  }.  retu
2fd60 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
2fd70 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
2fd80 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
2fd90 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
2fda0 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
2fdb0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
2fdc0 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
2fdd0 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
2fde0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
2fdf0 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
2fe00 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
2fe10 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
2fe20 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
2fe30 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2fe40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
2fe50 72 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  r;.  int iLimit 
2fe60 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  = 0;..  /* It's 
2fe70 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2fe80 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2fe90 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2fea0 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2feb0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2fec0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2fed0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2fee0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2fef0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2ff00 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
2ff10 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20   zBuf[0] = 0;.  
2ff20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2ff30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2ff40 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20  OERR );..  zDir 
2ff50 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69  = unixTempFileDi
2ff60 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d  r();.  if( zDir=
2ff70 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2ff80 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
2ff90 50 41 54 48 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  PATH;.  do{.    
2ffa0 75 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74  u64 r;.    sqlit
2ffb0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
2ffc0 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
2ffd0 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 32    assert( nBuf>2
2ffe0 20 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75   );.    zBuf[nBu
2fff0 66 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  f-2] = 0;.    sq
30000 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
30010 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  Buf, zBuf, "%s/"
30020 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
30030 5f 50 52 45 46 49 58 22 25 6c 6c 78 25 63 22 2c  _PREFIX"%llx%c",
30040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30050 20 20 20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30        zDir, r, 0
30060 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 5b  );.    if( zBuf[
30070 6e 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69  nBuf-2]!=0 || (i
30080 4c 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72 65  Limit++)>10 ) re
30090 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
300a0 52 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  R;.  }while( osA
300b0 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
300c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
300d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
300e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
300f0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
30100 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
30110 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
30120 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
30130 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
30140 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
30150 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
30160 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
30170 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
30180 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
30190 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
301a0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
301b0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
301c0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
301d0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
301e0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
301f0 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
30200 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
30210 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
30220 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
30230 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
30240 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
30250 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
30260 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
30270 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
30280 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
30290 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
302a0 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
302b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
302c0 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
302d0 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
302e0 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
302f0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
30300 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
30310 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
30320 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
30330 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
30340 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
30350 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
30360 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
30370 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
30380 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
30390 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
303a0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
303b0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
303c0 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
303d0 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
303e0 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
303f0 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
30400 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
30410 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
30420 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
30430 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
30440 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
30450 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
30460 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
30470 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
30480 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
30490 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
304a0 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
304b0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
304c0 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
304d0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
304e0 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
304f0 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
30500 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
30510 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
30520 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
30530 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
30540 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
30550 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
30560 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
30570 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
30580 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
30590 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
305a0 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
305b0 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
305c0 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
305d0 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
305e0 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
305f0 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
30600 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
30610 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
30620 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
30630 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
30640 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
30650 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
30660 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
30670 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
30680 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
30690 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
306a0 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
306b0 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
306c0 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
306d0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
306e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
306f0 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
30700 6c 6c 20 2a 2f 0a 0a 20 20 75 6e 69 78 45 6e 74  ll */..  unixEnt
30710 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
30720 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d   A stat() call m
30730 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69  ay fail for vari
30740 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20  ous reasons. If 
30750 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74  this happens, it
30760 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20   is.  ** almost 
30770 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20  certain that an 
30780 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74  open() call on t
30790 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c  he same path wil
307a0 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a  l also fail..  *
307b0 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f  * For this reaso
307c0 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  n, if an error o
307d0 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61  ccurs in the sta
307e0 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69  t() call here, i
307f0 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65  t is.  ** ignore
30800 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75  d and -1 is retu
30810 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
30820 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65   will try to ope
30830 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  n a new file.  *
30840 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  * descriptor on 
30850 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66  the same path, f
30860 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  ail, and return 
30870 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69  an error to SQLi
30880 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76  te..  **.  ** Ev
30890 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65  en if a subseque
308a0 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64  nt open() call d
308b0 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65  oes succeed, the
308c0 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66   consequences of
308d0 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68  .  ** not search
308e0 69 6e 67 20 66 6f 72 20 61 20 72 65 75 73 61 62  ing for a reusab
308f0 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
30900 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e  or are not dire.
30910 20 20 2a 2f 0a 20 20 69 66 28 20 69 6e 6f 64 65    */.  if( inode
30920 4c 69 73 74 21 3d 30 20 26 26 20 30 3d 3d 6f 73  List!=0 && 0==os
30930 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  Stat(zPath, &sSt
30940 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49  at) ){.    unixI
30950 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
30960 3b 0a 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ;..    pInode = 
30970 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
30980 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
30990 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
309a0 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
309b0 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
309c0 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
309d0 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 28 75  ->fileId.ino!=(u
309e0 36 34 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29  64)sStat.st_ino)
309f0 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64   ){.       pInod
30a00 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
30a10 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
30a20 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20   pInode ){.     
30a30 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a   UnixUnusedFd **
30a40 70 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pp;.      assert
30a50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
30a60 6e 6f 74 68 65 6c 64 28 70 49 6e 6f 64 65 2d 3e  notheld(pInode->
30a70 70 4c 6f 63 6b 4d 75 74 65 78 29 20 29 3b 0a 20  pLockMutex) );. 
30a80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
30a90 65 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d  ex_enter(pInode-
30aa0 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20  >pLockMutex);.  
30ab0 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f      for(pp=&pIno
30ac0 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  de->pUnused; *pp
30ad0 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
30ae0 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
30af0 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
30b00 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
30b10 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
30b20 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
30b30 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
30b40 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
30b50 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
30b60 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e  x_leave(pInode->
30b70 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 20  pLockMutex);.   
30b80 20 7d 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61   }.  }.  unixLea
30b90 76 65 4d 75 74 65 78 28 29 3b 0a 23 65 6e 64 69  veMutex();.#endi
30ba0 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56  f    /* if !OS_V
30bb0 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75  XWORKS */.  retu
30bc0 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f  rn pUnused;.}../
30bd0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6d 6f  *.** Find the mo
30be0 64 65 2c 20 75 69 64 20 61 6e 64 20 67 69 64 20  de, uid and gid 
30bf0 6f 66 20 66 69 6c 65 20 7a 46 69 6c 65 2e 20 0a  of file zFile. .
30c00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
30c10 74 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  tFileMode(.  con
30c20 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  st char *zFile, 
30c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30c40 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 6d  File name */.  m
30c50 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20  ode_t *pMode,   
30c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30c70 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f  * OUT: Permissio
30c80 6e 73 20 6f 66 20 7a 46 69 6c 65 20 2a 2f 0a 20  ns of zFile */. 
30c90 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20   uid_t *pUid,   
30ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cb0 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 6f 66 20   /* OUT: uid of 
30cc0 7a 46 69 6c 65 2e 20 2a 2f 0a 20 20 67 69 64 5f  zFile. */.  gid_
30cd0 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20  t *pGid         
30ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30cf0 55 54 3a 20 67 69 64 20 6f 66 20 7a 46 69 6c 65  UT: gid of zFile
30d00 2e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  . */.){.  struct
30d10 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
30d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
30d30 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e  put of stat() on
30d40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
30d50 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
30d60 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 30 3d  ITE_OK;.  if( 0=
30d70 3d 6f 73 53 74 61 74 28 7a 46 69 6c 65 2c 20 26  =osStat(zFile, &
30d80 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 2a 70  sStat) ){.    *p
30d90 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f  Mode = sStat.st_
30da0 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20  mode & 0777;.   
30db0 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73   *pUid = sStat.s
30dc0 74 5f 75 69 64 3b 0a 20 20 20 20 2a 70 47 69 64  t_uid;.    *pGid
30dd0 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b   = sStat.st_gid;
30de0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
30df0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
30e00 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 72 65 74  FSTAT;.  }.  ret
30e10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30e20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
30e30 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78  s called by unix
30e40 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d  Open() to determ
30e50 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65 72  ine the unix per
30e60 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63  missions.** to c
30e70 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20  reate new files 
30e80 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f  with. If no erro
30e90 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
30ea0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
30eb0 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61  rned.** and a va
30ec0 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  lue suitable for
30ed0 20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65 20   passing as the 
30ee0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74  third argument t
30ef0 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20  o open(2) is.** 
30f00 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64  written to *pMod
30f10 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  e. If an IO erro
30f20 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
30f30 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
30f40 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  s .** returned a
30f50 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
30f60 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f  *pMode is not mo
30f70 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  dified..**.** In
30f80 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 74 68 69   most cases, thi
30f90 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a  s routine sets *
30fa0 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63  pMode to 0, whic
30fb0 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a  h will become.**
30fc0 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74   an indication t
30fd0 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20  o robust_open() 
30fe0 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 66 69  to create the fi
30ff0 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49  le using.** SQLI
31000 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
31010 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75  PERMISSIONS adju
31020 73 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  sted by the umas
31030 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  k..** But if the
31040 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
31050 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72  ed is a WAL or r
31060 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
31070 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ile, then .** th
31080 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72  is function quer
31090 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ies the file-sys
310a0 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d  tem for the perm
310b0 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a  issions on the .
310c0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
310d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
310e0 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  nd sets *pMode t
310f0 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68  o this value. Wh
31100 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69  enever .** possi
31110 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75  ble, WAL and jou
31120 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63  rnal files are c
31130 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
31140 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
31150 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73  s .** as the ass
31160 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
31170 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
31180 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
31190 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69  E_8_3_NAMES opti
311a0 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
311b0 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  hen the.** origi
311c0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
311d0 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  unavailable.  Bu
311e0 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f  t 8_3_NAMES is o
311f0 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  nly used for.** 
31200 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20  FAT filesystems 
31210 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  and permissions 
31220 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68  do not matter th
31230 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65  ere, so just use
31240 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
31250 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a  permissions..*/.
31260 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43  static int findC
31270 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20  reateFileMode(. 
31280 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
31290 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
312a0 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65   /* Path of file
312b0 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e   (possibly) bein
312c0 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69  g created */.  i
312d0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
312e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
312f0 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61  * Flags passed a
31300 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74  s 4th argument t
31310 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d  o xOpen() */.  m
31320 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20  ode_t *pMode,   
31330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31340 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f  * OUT: Permissio
31350 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20  ns to open file 
31360 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20  with */.  uid_t 
31370 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20  *pUid,          
31380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
31390 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : uid to set on 
313a0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69  the file */.  gi
313b0 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20  d_t *pGid       
313c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
313d0 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74   OUT: gid to set
313e0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
313f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
31400 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
31410 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
31420 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20  ode */.  *pMode 
31430 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30  = 0;.  *pUid = 0
31440 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20  ;.  *pGid = 0;. 
31450 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
31460 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
31470 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
31480 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63  OURNAL) ){.    c
31490 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48  har zDb[MAX_PATH
314a0 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  NAME+1];     /* 
314b0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  Database file pa
314c0 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44  th */.    int nD
314d0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
314e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
314f0 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73  r of valid bytes
31500 20 69 6e 20 7a 44 62 20 2a 2f 0a 0a 20 20 20 20   in zDb */..    
31510 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61  /* zPath is a pa
31520 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a  th to a WAL or j
31530 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
31540 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
31550 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20   derives.    ** 
31560 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
31570 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
31580 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50  ase file from zP
31590 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ath. This block 
315a0 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74  handles.    ** t
315b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d  he following nam
315c0 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a  ing conventions:
315d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
315e0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a   "<path to db>-j
315f0 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20  ournal".    **  
31600 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
31610 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
31620 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
31630 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22  alNN".    **   "
31640 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
31650 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  NN".    **.    *
31660 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20  * where NN is a 
31670 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20  decimal number. 
31680 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63  The NN naming sc
31690 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a  hemes are .    *
316a0 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  * used by the te
316b0 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d  st_multiplex.c m
316c0 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  odule..    */.  
316d0 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53    nDb = sqlite3S
316e0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d  trlen30(zPath) -
316f0 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20   1; .    while( 
31700 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
31710 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 6e  ){.      /* In n
31720 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 2c  ormal operation,
31730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31740 65 20 6e 61 6d 65 20 77 69 6c 6c 20 61 6c 77 61  e name will alwa
31750 79 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  ys contain.     
31760 20 2a 2a 20 61 20 27 2d 27 20 63 68 61 72 61 63   ** a '-' charac
31770 74 65 72 2e 20 20 48 6f 77 65 76 65 72 20 69 6e  ter.  However in
31780 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 20 6d 6f   8+3 filename mo
31790 64 65 2c 20 6f 72 20 69 66 20 61 20 63 6f 72 72  de, or if a corr
317a0 75 70 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  upt.      ** rol
317b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 70  lback journal sp
317c0 65 63 69 66 69 65 73 20 61 20 6d 61 73 74 65 72  ecifies a master
317d0 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 20 61 20   journal with a 
317e0 67 6f 6f 66 79 20 6e 61 6d 65 2c 20 74 68 65 6e  goofy name, then
317f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 27 2d  .      ** the '-
31800 27 20 6d 69 67 68 74 20 62 65 20 6d 69 73 73 69  ' might be missi
31810 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ng. */.      if(
31820 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68   nDb==0 || zPath
31830 5b 6e 44 62 5d 3d 3d 27 2e 27 20 29 20 72 65 74  [nDb]=='.' ) ret
31840 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
31850 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20       nDb--;.    
31860 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  }.    memcpy(zDb
31870 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20  , zPath, nDb);. 
31880 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c     zDb[nDb] = '\
31890 30 27 3b 0a 0a 20 20 20 20 72 63 20 3d 20 67 65  0';..    rc = ge
318a0 74 46 69 6c 65 4d 6f 64 65 28 7a 44 62 2c 20 70  tFileMode(zDb, p
318b0 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64  Mode, pUid, pGid
318c0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  );.  }else if( f
318d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
318e0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
318f0 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d   ){.    *pMode =
31900 20 30 36 30 30 3b 0a 20 20 7d 65 6c 73 65 20 69   0600;.  }else i
31910 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
31920 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20  E_OPEN_URI ){.  
31930 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
31940 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  a main database 
31950 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
31960 65 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69  e was opened usi
31970 6e 67 20 61 20 55 52 49 0a 20 20 20 20 2a 2a 20  ng a URI.    ** 
31980 66 69 6c 65 6e 61 6d 65 2c 20 63 68 65 63 6b 20  filename, check 
31990 66 6f 72 20 74 68 65 20 22 6d 6f 64 65 6f 66 22  for the "modeof"
319a0 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20 70   parameter. If p
319b0 72 65 73 65 6e 74 2c 20 69 6e 74 65 72 70 72 65  resent, interpre
319c0 74 0a 20 20 20 20 2a 2a 20 69 74 73 20 76 61 6c  t.    ** its val
319d0 75 65 20 61 73 20 61 20 66 69 6c 65 6e 61 6d 65  ue as a filename
319e0 20 61 6e 64 20 74 72 79 20 74 6f 20 63 6f 70 79   and try to copy
319f0 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64 20 61   the mode, uid a
31a00 6e 64 20 67 69 64 20 66 72 6f 6d 0a 20 20 20 20  nd gid from.    
31a10 2a 2a 20 74 68 61 74 20 66 69 6c 65 2e 20 20 2a  ** that file.  *
31a20 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
31a30 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
31a40 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 50 61 74  i_parameter(zPat
31a50 68 2c 20 22 6d 6f 64 65 6f 66 22 29 3b 0a 20 20  h, "modeof");.  
31a60 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
31a70 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64   rc = getFileMod
31a80 65 28 7a 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64  e(z, pMode, pUid
31a90 2c 20 70 47 69 64 29 3b 0a 20 20 20 20 7d 0a 20  , pGid);.    }. 
31aa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
31ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
31ac0 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a  e file zPath..**
31ad0 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c   .** Previously,
31ae0 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c   the SQLite OS l
31af0 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20  ayer used three 
31b00 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61  functions in pla
31b10 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e  ce of this.** on
31b20 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  e:.**.**     sql
31b30 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
31b40 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  ite();.**     sq
31b50 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
31b60 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  nly();.**     sq
31b70 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
31b80 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  sive();.**.** Th
31b90 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73  ese calls corres
31ba0 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c  pond to the foll
31bb0 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
31bc0 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ns of flags:.**.
31bd0 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65  **     ReadWrite
31be0 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57  () ->     (READW
31bf0 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a  RITE | CREATE).*
31c00 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29  *     ReadOnly()
31c10 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e    ->     (READON
31c20 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e  LY) .**     Open
31c30 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28  Exclusive() -> (
31c40 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
31c50 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a  TE | EXCLUSIVE).
31c60 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70  **.** The old Op
31c70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63  enExclusive() ac
31c80 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e  cepted a boolean
31c90 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c   argument - "del
31ca0 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75  Flag". If.** tru
31cb0 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  e, the file was 
31cc0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65  configured to be
31cd0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
31ce0 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a  eleted when the.
31cf0 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63  ** file handle c
31d00 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76  losed. To achiev
31d10 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63  e the same effec
31d20 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77  t using this new
31d30 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20   .** interface, 
31d40 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e  add the DELETEON
31d50 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68  CLOSE flag to th
31d60 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62  ose specified ab
31d70 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e  ove for .** Open
31d80 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a  Exclusive()..*/.
31d90 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
31da0 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
31db0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
31dc0 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66      /* The VFS f
31dd0 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
31de0 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f   the xOpen metho
31df0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
31e00 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
31e10 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20      /* Pathname 
31e20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70  of file to be op
31e30 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
31e40 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
31e50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
31e60 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
31e70 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f   be filled in */
31e80 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
31e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ea0 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74  /* Input flags t
31eb0 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70  o control the op
31ec0 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a  ening */.  int *
31ed0 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
31ee0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
31ef0 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  t flags returned
31f00 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20   to SQLite core 
31f10 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
31f20 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20   *p = (unixFile 
31f30 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66  *)pFile;.  int f
31f40 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
31f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
31f60 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74  e descriptor ret
31f70 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20  urned by open() 
31f80 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  */.  int openFla
31f90 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
31fa0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
31fb0 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a  pass to open() *
31fc0 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
31fd0 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
31fe0 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
31ff0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
32000 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20  int noLock;     
32010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32020 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c  * True to omit l
32030 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
32040 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
32050 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
32060 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
32070 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
32080 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  .  int ctrlFlags
32090 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
320a0 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20    /* UNIXFILE_* 
320b0 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  flags */..  int 
320c0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
320d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
320e0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
320f0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
32100 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
32110 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
32120 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
32130 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
32140 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
32150 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
32160 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
32170 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
32180 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
32190 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
321a0 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
321b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
321c0 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49  WRITE);.#if SQLI
321d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
321e0 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73  G_STYLE.  int is
321f0 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c  AutoProxy  = (fl
32200 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
32210 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65  N_AUTOPROXY);.#e
32220 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
32230 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53  (__APPLE__) || S
32240 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
32250 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72  KING_STYLE.  str
32260 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
32270 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  o;.#endif..  /* 
32280 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61  If creating a ma
32290 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c  ster or main-fil
322a0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20  e journal, this 
322b0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70  function will op
322c0 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64  en.  ** a file-d
322d0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
322e0 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20   directory too. 
322f0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75  The first time u
32300 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69  nixSync().  ** i
32310 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72  s called the dir
32320 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
32330 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66  riptor will be f
32340 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f  sync()ed and clo
32350 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e  se()d..  */.  in
32360 74 20 69 73 4e 65 77 4a 72 6e 6c 20 3d 20 28 69  t isNewJrnl = (i
32370 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
32380 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
32390 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
323a0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
323b0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
323c0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
323d0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
323e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
323f0 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61    ));..  /* If a
32400 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
32410 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
32420 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
32430 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
32440 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
32450 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
32460 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
32470 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
32480 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
32490 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
324a0 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e  THNAME+2];.  con
324b0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
324c0 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
324d0 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
324e0 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
324f0 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
32500 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
32510 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
32520 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
32530 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
32540 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
32550 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
32560 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
32570 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
32580 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
32590 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
325a0 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
325b0 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
325c0 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
325d0 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
325e0 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
325f0 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
32600 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
32610 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
32620 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
32630 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
32640 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
32650 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
32660 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
32670 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
32680 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
32690 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
326a0 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
326b0 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
326c0 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
326d0 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
326e0 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
326f0 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
32700 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
32710 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
32720 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
32730 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
32740 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
32750 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
32760 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
32770 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
32780 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
32790 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
327a0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
327b0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
327c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
327d0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
327e0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
327f0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
32800 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
32810 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
32820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
32830 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
32840 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
32850 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
32860 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
32870 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
32880 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
32890 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
328a0 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
328b0 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
328c0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
328d0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
328e0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
328f0 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
32900 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
32910 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
32920 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
32930 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
32940 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
32950 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
32960 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
32970 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
32980 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
32990 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
329a0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
329b0 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
329c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
329d0 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  _WAL.  );..  /* 
329e0 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68 61  Detect a pid cha
329f0 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  nge and reset th
32a00 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69  e PRNG.  There i
32a10 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
32a20 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63  on.  ** here suc
32a30 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f  h that two or mo
32a40 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74  re threads all t
32a50 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61  rying to open da
32a60 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20  tabases at.  ** 
32a70 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74  the same instant
32a80 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74   might all reset
32a90 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20   the PRNG.  But 
32aa0 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a  multiple resets.
32ab0 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73    ** are harmles
32ac0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61  s..  */.  if( ra
32ad0 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47  ndomnessPid!=osG
32ae0 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20 20 20  etpid(0) ){.    
32af0 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20  randomnessPid = 
32b00 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20 20 20  osGetpid(0);.   
32b10 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
32b20 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 20 20  ess(0,0);.  }.  
32b30 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
32b40 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
32b50 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
32b60 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
32b70 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
32b80 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
32b90 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
32ba0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
32bb0 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
32bc0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
32bd0 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
32be0 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
32bf0 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
32c00 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
32c10 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  64(sizeof(*pUnus
32c20 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
32c30 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
32c40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32c50 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
32c60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
32c70 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
32c80 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
32c90 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ;..    /* Databa
32ca0 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
32cb0 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
32cc0 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
32cd0 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55  are not.    ** U
32ce0 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
32cf0 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
32d00 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
32d10 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20  passed into.    
32d20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
32d30 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
32d40 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67     assert( (flag
32d50 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
32d60 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74  URI) || zName[st
32d70 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
32d80 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66  0 );..  }else if
32d90 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( !zName ){.    
32da0 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e  /* If zName is N
32db0 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ULL, the upper l
32dc0 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69  ayer is requesti
32dd0 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  ng a temp file. 
32de0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  */.    assert(is
32df0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4e 65 77  Delete && !isNew
32e00 4a 72 6e 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Jrnl);.    rc = 
32e10 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
32e20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
32e30 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
32e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32e50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
32e60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
32e70 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
32e80 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  e;..    /* Gener
32e90 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  ated temporary f
32ea0 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77  ilenames are alw
32eb0 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  ays double-zero 
32ec0 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a  terminated.    *
32ed0 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c  * for use by sql
32ee0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
32ef0 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73  er(). */.    ass
32f00 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65  ert( zName[strle
32f10 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29  n(zName)+1]==0 )
32f20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
32f30 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
32f40 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  of the flags par
32f50 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
32f60 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a   POSIX function.
32f70 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65    ** open(). The
32f80 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75  se must be calcu
32f90 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70  lated even if op
32fa0 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  en() is not call
32fb0 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79  ed, as.  ** they
32fc0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
32fd0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  s part of the fi
32fe0 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73  le handle and us
32ff0 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20  ed by the .  ** 
33000 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63  'conch file' loc
33010 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c  king functions l
33020 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69  ater on.  */.  i
33030 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
33040 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
33050 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73  RDONLY;.  if( is
33060 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e  ReadWrite ) open
33070 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b  Flags |= O_RDWR;
33080 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
33090 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  )    openFlags |
330a0 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
330b0 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
330c0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45  penFlags |= (O_E
330d0 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b  XCL|O_NOFOLLOW);
330e0 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  .  openFlags |= 
330f0 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  (O_LARGEFILE|O_B
33100 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66  INARY);..  if( f
33110 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f  d<0 ){.    mode_
33120 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  t openMode;     
33130 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d           /* Perm
33140 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74  issions to creat
33150 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20  e file with */. 
33160 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20     uid_t uid;   
33170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33180 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74   /* Userid for t
33190 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67  he file */.    g
331a0 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20  id_t gid;       
331b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
331c0 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20  Groupid for the 
331d0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  file */.    rc =
331e0 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
331f0 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  ode(zName, flags
33200 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69  , &openMode, &ui
33210 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66  d, &gid);.    if
33220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33230 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
33240 20 21 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74   !p->pPreallocat
33250 65 64 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20  edUnused );.    
33260 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
33270 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
33280 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
33290 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
332a0 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74  NAL );.      ret
332b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
332c0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
332d0 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
332e0 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
332f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
33300 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25  ENX   %-3d %s 0%
33310 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c  o\n", fd, zName,
33320 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20   openFlags));.  
33330 20 20 61 73 73 65 72 74 28 20 21 69 73 45 78 63    assert( !isExc
33340 6c 75 73 69 76 65 20 7c 7c 20 28 6f 70 65 6e 46  lusive || (openF
33350 6c 61 67 73 20 26 20 4f 5f 43 52 45 41 54 29 21  lags & O_CREAT)!
33360 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 66 64  =0 );.    if( fd
33370 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
33380 69 73 4e 65 77 4a 72 6e 6c 20 26 26 20 65 72 72  isNewJrnl && err
33390 6e 6f 3d 3d 45 41 43 43 45 53 20 26 26 20 6f 73  no==EACCES && os
333a0 41 63 63 65 73 73 28 7a 4e 61 6d 65 2c 20 46 5f  Access(zName, F_
333b0 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OK) ){.        /
333c0 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 63  * If unable to c
333d0 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
333e0 62 65 63 61 75 73 65 20 74 68 65 20 64 69 72 65  because the dire
333f0 63 74 6f 72 79 20 69 73 20 6e 6f 74 0a 20 20 20  ctory is not.   
33400 20 20 20 20 20 2a 2a 20 77 72 69 74 61 62 6c 65       ** writable
33410 2c 20 63 68 61 6e 67 65 20 74 68 65 20 65 72 72  , change the err
33420 6f 72 20 63 6f 64 65 20 74 6f 20 69 6e 64 69 63  or code to indic
33430 61 74 65 20 74 68 61 74 2e 20 2a 2f 0a 20 20 20  ate that. */.   
33440 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
33450 5f 52 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54  _READONLY_DIRECT
33460 4f 52 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ORY;.      }else
33470 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 49 53 44   if( errno!=EISD
33480 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
33490 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
334a0 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74  Failed to open t
334b0 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  he file for read
334c0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
334d0 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f  ry read-only. */
334e0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
334f0 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
33500 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
33510 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
33520 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73         openFlags
33530 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43   &= ~(O_RDWR|O_C
33540 52 45 41 54 29 3b 0a 20 20 20 20 20 20 20 20 66  REAT);.        f
33550 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
33560 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
33570 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
33580 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20  |= O_RDONLY;.   
33590 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
335a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 64 20  = 1;.        fd 
335b0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
335c0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
335d0 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 20  openMode);.     
335e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
335f0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 69   fd<0 ){.      i
33600 6e 74 20 72 63 32 20 3d 20 75 6e 69 78 4c 6f 67  nt rc2 = unixLog
33610 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
33620 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
33630 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
33640 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33650 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
33660 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
33670 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
33680 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
33690 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69  process is runni
336a0 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69  ng as root and i
336b0 66 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77  f creating a new
336c0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a   rollback.    **
336d0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20   journal or WAL 
336e0 66 69 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77  file, set the ow
336f0 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a  nership of the j
33700 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f  ournal or WAL to
33710 20 62 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73   be.    ** the s
33720 61 6d 65 20 61 73 20 74 68 65 20 6f 72 69 67 69  ame as the origi
33730 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20  nal database..  
33740 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61    */.    if( fla
33750 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
33760 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
33770 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
33780 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46  ){.      robustF
33790 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67  chown(fd, uid, g
337a0 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  id);.    }.  }. 
337b0 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29   assert( fd>=0 )
337c0 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ;.  if( pOutFlag
337d0 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c  s ){.    *pOutFl
337e0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
337f0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 61  ..  if( p->pPrea
33800 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 29  llocatedUnused )
33810 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c  {.    p->pPreall
33820 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e 66 64  ocatedUnused->fd
33830 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 50   = fd;.    p->pP
33840 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
33850 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  d->flags = flags
33860 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44  ;.  }..  if( isD
33870 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f  elete ){.#if OS_
33880 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74  VXWORKS.    zPat
33890 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66  h = zName;.#elif
338a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
338b0 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f  UNLINK_AFTER_CLO
338c0 53 45 29 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  SE).    zPath = 
338d0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
338e0 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  "%s", zName);.  
338f0 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
33900 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  {.      robust_c
33910 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
33920 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65 74  NE__);.      ret
33930 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
33940 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c  _BKPT;.    }.#el
33950 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  se.    osUnlink(
33960 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zName);.#endif. 
33970 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   }.#if SQLITE_EN
33980 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
33990 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70  LE.  else{.    p
339a0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
339b0 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e  enFlags;.  }.#en
339c0 64 69 66 0a 20 20 0a 23 69 66 20 64 65 66 69 6e  dif.  .#if defin
339d0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
339e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
339f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
33a00 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26  f( fstatfs(fd, &
33a10 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
33a20 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
33a30 72 6e 6f 28 70 2c 20 65 72 72 6e 6f 29 3b 0a 20  rno(p, errno);. 
33a40 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
33a50 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p, fd, __LINE__)
33a60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
33a70 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
33a80 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d  ;.  }.  if (0 ==
33a90 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22   strncmp("msdos"
33aa0 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  , fsInfo.f_fstyp
33ab0 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20  ename, 5)) {.   
33ac0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
33ad0 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20  le)->fsFlags |= 
33ae0 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
33af0 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69  S_MSDOS;.  }.  i
33b00 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
33b10 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e  "exfat", fsInfo.
33b20 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
33b30 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
33b40 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
33b50 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
33b60 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
33b70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
33b80 20 53 65 74 20 75 70 20 61 70 70 72 6f 70 72 69   Set up appropri
33b90 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f  ate ctrlFlags */
33ba0 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
33bb0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
33bc0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
33bd0 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
33be0 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
33bf0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  )              c
33c00 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
33c10 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 6e  FILE_RDONLY;.  n
33c20 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
33c30 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
33c40 44 42 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b  DB;.  if( noLock
33c50 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
33c60 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
33c70 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
33c80 3b 0a 20 20 69 66 28 20 69 73 4e 65 77 4a 72 6e  ;.  if( isNewJrn
33c90 6c 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  l )             
33ca0 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
33cb0 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b  NIXFILE_DIRSYNC;
33cc0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
33cd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29  QLITE_OPEN_URI )
33ce0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
33cf0 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66  IXFILE_URI;..#if
33d00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
33d10 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66  OCKING_STYLE.#if
33d20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
33d30 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69  ROXY_LOCKING.  i
33d40 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a  sAutoProxy = 1;.
33d50 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41  #endif.  if( isA
33d60 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61  utoProxy && (zPa
33d70 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e  th!=NULL) && (!n
33d80 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e  oLock) && pVfs->
33d90 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  xOpen ){.    cha
33da0 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65  r *envforce = ge
33db0 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52  tenv("SQLITE_FOR
33dc0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
33dd0 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50  ");.    int useP
33de0 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  roxy = 0;..    /
33df0 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  * SQLITE_FORCE_P
33e00 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20  ROXY_LOCKING==1 
33e10 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61  means force alwa
33e20 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20  ys use proxy, 0 
33e30 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65  means .    ** ne
33e40 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e  ver use proxy, N
33e50 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72  ULL means use pr
33e60 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61  oxy for non-loca
33e70 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a  l files only.  *
33e80 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72  /.    if( envfor
33e90 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ce!=NULL ){.    
33ea0 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f    useProxy = ato
33eb0 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20  i(envforce)>0;. 
33ec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33ed0 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49  useProxy = !(fsI
33ee0 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
33ef0 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  LOCAL);.    }.  
33f00 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29    if( useProxy )
33f10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c  {.      rc = fil
33f20 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
33f30 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  , fd, pFile, zPa
33f40 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a  th, ctrlFlags);.
33f50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33f70 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
33f80 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28  nsformUnixFile((
33f90 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c  unixFile*)pFile,
33fa0 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20   ":auto:");.    
33fb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33fc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33fd0 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c     /* Use unixCl
33fe0 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  ose to clean up 
33ff0 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64  the resources ad
34000 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69  ded in fillInUni
34010 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20  xFile .         
34020 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c   ** and clear al
34030 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27  l the structure'
34040 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53  s references.  S
34050 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20  pecifically, .  
34060 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65          ** pFile
34070 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20  ->pMethods will 
34080 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74  be NULL so sqlit
34090 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62  e3OsClose will b
340a0 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20  e a no-op .     
340b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
340c0 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c    unixClose(pFil
340d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
340e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
340f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
34100 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
34110 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  hed;.    }.  }.#
34120 65 6e 64 69 66 0a 20 20 0a 20 20 61 73 73 65 72  endif.  .  asser
34130 74 28 20 7a 50 61 74 68 3d 3d 30 20 7c 7c 20 7a  t( zPath==0 || z
34140 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20  Path[0]=='/' .  
34150 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
34160 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
34170 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
34180 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
34190 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 29  AIN_JOURNAL .  )
341a0 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55  ;.  rc = fillInU
341b0 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
341c0 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
341d0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65  ctrlFlags);..ope
341e0 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66  n_finished:.  if
341f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34200 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
34210 72 65 65 28 70 2d 3e 70 50 72 65 61 6c 6c 6f 63  ree(p->pPrealloc
34220 61 74 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 7d  atedUnused);.  }
34230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34240 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
34250 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
34260 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
34270 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
34280 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
34290 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
342a0 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
342b0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
342c0 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20  nt unixDelete(. 
342d0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
342e0 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46  tUsed,     /* VF
342f0 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
34300 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65  s as the xDelete
34310 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
34320 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
34330 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
34340 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  f file to be del
34350 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  eted */.  int di
34360 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  rSync           
34370 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
34380 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72  fsync() director
34390 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
343a0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
343b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
343c0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
343d0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
343e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
343f0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
34400 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
34410 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61  if( osUnlink(zPa
34420 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  th)==(-1) ){.   
34430 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45   if( errno==ENOE
34440 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  NT.#if OS_VXWORK
34450 53 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41  S.        || osA
34460 63 63 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d  ccess(zPath,0)!=
34470 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a  0.#endif.    ){.
34480 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34490 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
344a0 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OENT;.    }else{
344b0 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
344c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
344d0 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
344e0 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
344f0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
34500 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66   rc;.  }.#ifndef
34510 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
34520 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64  DIRSYNC.  if( (d
34530 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29  irSync & 1)!=0 )
34540 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
34550 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
34560 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
34570 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
34580 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34590 20 20 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e     if( full_fsyn
345a0 63 28 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20  c(fd,0,0) ){.   
345b0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
345c0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
345d0 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22  ERR_DIR_FSYNC, "
345e0 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a  fsync", zPath);.
345f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f        }.      ro
34600 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
34610 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
34620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
34630 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
34640 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20  _CANTOPEN );.   
34650 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
34660 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  K;.    }.  }.#en
34670 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
34680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
34690 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
346a0 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
346b0 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50  sions of file zP
346c0 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74  ath. The.** test
346d0 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e   performed depen
346e0 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
346f0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
34700 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
34710 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e  S_EXISTS: Return
34720 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65   1 if the file e
34730 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c  xists.**     SQL
34740 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
34750 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69  RITE: Return 1 i
34760 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
34770 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e  ad and writable.
34780 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
34790 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20  CCESS_READONLY: 
347a0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
347b0 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65  file is readable
347c0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
347d0 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
347e0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63  tatic int unixAc
347f0 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
34800 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
34810 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61  /* The VFS conta
34820 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65  ining this xAcce
34830 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  ss method */.  c
34840 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
34850 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f  ,      /* Path o
34860 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78  f the file to ex
34870 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66  amine */.  int f
34880 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
34890 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65     /* What do we
348a0 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61   want to learn a
348b0 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66  bout the zPath f
348c0 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ile? */.  int *p
348d0 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
348e0 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
348f0 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a  t boolean here *
34900 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
34910 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
34920 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
34930 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
34940 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
34950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
34960 65 73 4f 75 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  esOut!=0 );..  /
34970 2a 20 54 68 65 20 73 70 65 63 20 73 61 79 73 20  * The spec says 
34980 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
34990 70 6f 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20  possible values 
349a0 66 6f 72 20 66 6c 61 67 73 2e 20 20 42 75 74 20  for flags.  But 
349b0 6f 6e 6c 79 0a 20 20 2a 2a 20 74 77 6f 20 6f 66  only.  ** two of
349c0 20 74 68 65 6d 20 61 72 65 20 61 63 74 75 61 6c   them are actual
349d0 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 61 73 73  ly used */.  ass
349e0 65 72 74 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49  ert( flags==SQLI
349f0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
34a00 20 7c 7c 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54   || flags==SQLIT
34a10 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
34a20 54 45 20 29 3b 0a 0a 20 20 69 66 28 20 66 6c 61  TE );..  if( fla
34a30 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
34a40 53 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20  S_EXISTS ){.    
34a50 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
34a60 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
34a70 28 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68  (0==osStat(zPath
34a80 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73  , &buf) && buf.s
34a90 74 5f 73 69 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c  t_size>0);.  }el
34aa0 73 65 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74  se{.    *pResOut
34ab0 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74   = osAccess(zPat
34ac0 68 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30  h, W_OK|R_OK)==0
34ad0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
34ae0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
34af0 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
34b00 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28   mkFullPathname(
34b10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
34b20 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
34b30 20 20 20 2f 2a 20 49 6e 70 75 74 20 70 61 74 68     /* Input path
34b40 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
34b50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34b60 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
34b70 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
34b80 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
34b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
34ba0 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
34bb0 20 62 75 66 66 65 72 20 7a 4f 75 74 20 2a 2f 0a   buffer zOut */.
34bc0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 74 68 20 3d  ){.  int nPath =
34bd0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
34be0 28 7a 50 61 74 68 29 3b 0a 20 20 69 6e 74 20 69  (zPath);.  int i
34bf0 4f 66 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  Off = 0;.  if( z
34c00 50 61 74 68 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a  Path[0]!='/' ){.
34c10 20 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64      if( osGetcwd
34c20 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d  (zOut, nOut-2)==
34c30 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
34c40 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
34c50 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
34c60 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a  KPT, "getcwd", z
34c70 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
34c80 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 53   iOff = sqlite3S
34c90 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20  trlen30(zOut);. 
34ca0 20 20 20 7a 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20     zOut[iOff++] 
34cb0 3d 20 27 2f 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '/';.  }.  if(
34cc0 20 28 69 4f 66 66 2b 6e 50 61 74 68 2b 31 29 3e   (iOff+nPath+1)>
34cd0 6e 4f 75 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  nOut ){.    /* S
34ce0 51 4c 69 74 65 20 61 73 73 75 6d 65 73 20 74 68  QLite assumes th
34cf0 61 74 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  at xFullPathname
34d00 28 29 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  () nul-terminate
34d10 73 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  s the output buf
34d20 66 65 72 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20  fer.    ** even 
34d30 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 61 6e  if it returns an
34d40 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
34d50 7a 4f 75 74 5b 69 4f 66 66 5d 20 3d 20 27 5c 30  zOut[iOff] = '\0
34d60 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ';.    return SQ
34d70 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
34d80 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
34d90 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
34da0 69 4f 66 66 2c 20 26 7a 4f 75 74 5b 69 4f 66 66  iOff, &zOut[iOff
34db0 5d 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  ], "%s", zPath);
34dc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34dd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75  _OK;.}../*.** Tu
34de0 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
34df0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
34e00 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
34e10 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
34e20 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
34e30 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
34e40 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
34e50 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
34e60 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
34e70 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
34e80 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
34e90 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
34ea0 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
34eb0 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
34ec0 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
34ed0 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
34ee0 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
34ef0 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
34f00 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
34f10 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
34f20 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
34f30 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
34f40 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
34f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
34f60 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
34f70 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
34f80 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
34f90 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
34fa0 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
34fb0 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
34fc0 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
34fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
34fe0 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
34ff0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
35000 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
35010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35020 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
35030 2f 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  /.){.#if !define
35040 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29  d(HAVE_READLINK)
35050 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 48 41 56   || !defined(HAV
35060 45 5f 4c 53 54 41 54 29 0a 20 20 72 65 74 75 72  E_LSTAT).  retur
35070 6e 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65  n mkFullPathname
35080 28 7a 50 61 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f  (zPath, zOut, nO
35090 75 74 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ut);.#else.  int
350a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
350b0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
350c0 69 6e 74 20 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20  int nLink = 1;  
350d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
350e0 20 4e 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f   Number of symbo
350f0 6c 69 63 20 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77  lic links follow
35100 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63  ed so far */.  c
35110 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d  onst char *zIn =
35120 20 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20   zPath;      /* 
35130 49 6e 70 75 74 20 70 61 74 68 20 66 6f 72 20 65  Input path for e
35140 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
35150 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
35160 2a 7a 44 65 6c 20 3d 20 30 3b 0a 0a 20 20 61 73  *zDel = 0;..  as
35170 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61  sert( pVfs->mxPa
35180 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48  thname==MAX_PATH
35190 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44  NAME );.  UNUSED
351a0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
351b0 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
351c0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
351d0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
351e0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
351f0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
35200 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
35210 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
35220 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
35230 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
35240 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
35250 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
35260 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
35270 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
35280 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
35290 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
352a0 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
352b0 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
352c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
352d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
352e0 52 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20  R );..  do {..  
352f0 20 20 2f 2a 20 43 61 6c 6c 20 73 74 61 74 28 29    /* Call stat()
35300 20 6f 6e 20 70 61 74 68 20 7a 49 6e 2e 20 53 65   on path zIn. Se
35310 74 20 62 4c 69 6e 6b 20 74 6f 20 74 72 75 65 20  t bLink to true 
35320 69 66 20 74 68 65 20 70 61 74 68 20 69 73 20 61  if the path is a
35330 20 73 79 6d 62 6f 6c 69 63 0a 20 20 20 20 2a 2a   symbolic.    **
35340 20 6c 69 6e 6b 2c 20 6f 72 20 66 61 6c 73 65 20   link, or false 
35350 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 20  otherwise.  */. 
35360 20 20 20 69 6e 74 20 62 4c 69 6e 6b 20 3d 20 30     int bLink = 0
35370 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
35380 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20 6f  t buf;.    if( o
35390 73 4c 73 74 61 74 28 7a 49 6e 2c 20 26 62 75 66  sLstat(zIn, &buf
353a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
353b0 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20  ( errno!=ENOENT 
353c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
353d0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
353e0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
353f0 54 2c 20 22 6c 73 74 61 74 22 2c 20 7a 49 6e 29  T, "lstat", zIn)
35400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
35410 6c 73 65 7b 0a 20 20 20 20 20 20 62 4c 69 6e 6b  lse{.      bLink
35420 20 3d 20 53 5f 49 53 4c 4e 4b 28 62 75 66 2e 73   = S_ISLNK(buf.s
35430 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a  t_mode);.    }..
35440 20 20 20 20 69 66 28 20 62 4c 69 6e 6b 20 29 7b      if( bLink ){
35450 0a 20 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d  .      if( zDel=
35460 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  =0 ){.        zD
35470 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  el = sqlite3_mal
35480 6c 6f 63 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20  loc(nOut);.     
35490 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29     if( zDel==0 )
354a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
354b0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
354c0 65 6c 73 65 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b  else if( ++nLink
354d0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53 59 4d 4c  >SQLITE_MAX_SYML
354e0 49 4e 4b 53 20 29 7b 0a 20 20 20 20 20 20 20 20  INKS ){.        
354f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
35500 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
35510 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
35520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35530 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 6f         nByte = o
35540 73 52 65 61 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a  sReadlink(zIn, z
35550 44 65 6c 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20  Del, nOut-1);.  
35560 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c        if( nByte<
35570 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
35580 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
35590 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
355a0 5f 42 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e 6b  _BKPT, "readlink
355b0 22 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20 20  ", zIn);.       
355c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
355d0 20 20 69 66 28 20 7a 44 65 6c 5b 30 5d 21 3d 27    if( zDel[0]!='
355e0 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  /' ){.          
355f0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
35600 20 20 20 20 20 66 6f 72 28 6e 20 3d 20 73 71 6c       for(n = sql
35610 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 6e  ite3Strlen30(zIn
35620 29 3b 20 6e 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d  ); n>0 && zIn[n-
35630 31 5d 21 3d 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20  1]!='/'; n--);. 
35640 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
35650 42 79 74 65 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b  Byte+n+1>nOut ){
35660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
35670 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
35680 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
35690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
356a0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f             memmo
356b0 76 65 28 26 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65  ve(&zDel[n], zDe
356c0 6c 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20  l, nByte+1);.   
356d0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
356e0 79 28 7a 44 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b  y(zDel, zIn, n);
356f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
35700 42 79 74 65 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Byte += n;.     
35710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
35730 44 65 6c 5b 6e 42 79 74 65 5d 20 3d 20 27 5c 30  Del[nByte] = '\0
35740 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
35750 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 49 6e 20     }..      zIn 
35760 3d 20 7a 44 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20  = zDel;.    }.. 
35770 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
35780 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21  QLITE_OK || zIn!
35790 3d 7a 4f 75 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d  =zOut || zIn[0]=
357a0 3d 27 2f 27 20 29 3b 0a 20 20 20 20 69 66 28 20  ='/' );.    if( 
357b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
357c0 20 7a 49 6e 21 3d 7a 4f 75 74 20 29 7b 0a 20 20   zIn!=zOut ){.  
357d0 20 20 20 20 72 63 20 3d 20 6d 6b 46 75 6c 6c 50      rc = mkFullP
357e0 61 74 68 6e 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75  athname(zIn, zOu
357f0 74 2c 20 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  t, nOut);.    }.
35800 20 20 20 20 69 66 28 20 62 4c 69 6e 6b 3d 3d 30      if( bLink==0
35810 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 49   ) break;.    zI
35820 6e 20 3d 20 7a 4f 75 74 3b 0a 20 20 7d 77 68 69  n = zOut;.  }whi
35830 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
35840 4b 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  K );..  sqlite3_
35850 66 72 65 65 28 7a 44 65 6c 29 3b 0a 20 20 72 65  free(zDel);.  re
35860 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 20  turn rc;.#endif 
35870 20 20 2f 2a 20 48 41 56 45 5f 52 45 41 44 4c 49    /* HAVE_READLI
35880 4e 4b 20 26 26 20 48 41 56 45 5f 4c 53 54 41 54  NK && HAVE_LSTAT
35890 20 2a 2f 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20   */.}...#ifndef 
358a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
358b0 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
358c0 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
358d0 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
358e0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
358f0 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
35900 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
35910 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
35920 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
35930 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
35940 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e  #include <dlfcn.
35950 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  h>.static void *
35960 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74  unixDlOpen(sqlit
35970 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
35980 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
35990 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45  lename){.  UNUSE
359a0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
359b0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  sed);.  return d
359c0 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  lopen(zFilename,
359d0 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44   RTLD_NOW | RTLD
359e0 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  _GLOBAL);.}../*.
359f0 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  ** SQLite calls 
35a00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d  this function im
35a10 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
35a20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c  a call to unixDl
35a30 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78  Sym() or.** unix
35a40 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28  DlOpen() fails (
35a50 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70  returns a null p
35a60 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f  ointer). If a mo
35a70 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f  re detailed erro
35a80 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20  r.** message is 
35a90 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73  available, it is
35aa0 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66   written to zBuf
35ab0 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  Out. If no error
35ac0 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61   message.** is a
35ad0 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75  vailable, zBufOu
35ae0 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  t is left unmodi
35af0 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20  fied and SQLite 
35b00 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a  uses a default.*
35b10 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  * error message.
35b20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
35b30 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69  unixDlError(sqli
35b40 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
35b50 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
35b60 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f   *zBufOut){.  co
35b70 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
35b80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
35b90 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75  ER(NotUsed);.  u
35ba0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
35bb0 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f  .  zErr = dlerro
35bc0 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  r();.  if( zErr 
35bd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
35be0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
35bf0 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72  ufOut, "%s", zEr
35c00 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  r);.  }.  unixLe
35c10 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74  aveMutex();.}.st
35c20 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78  atic void (*unix
35c30 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
35c40 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
35c50 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a   *p, const char*
35c60 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
35c70 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74  /* .  ** GCC wit
35c80 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
35c90 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30  rs says that C90
35ca0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
35cb0 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20  a void* to be.  
35cc0 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70  ** cast into a p
35cd0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
35ce0 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74  tion.  And yet t
35cf0 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d  he library dlsym
35d00 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  () routine.  ** 
35d10 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20  returns a void* 
35d20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
35d30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
35d40 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77  unction.  So how
35d50 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20   do we.  ** use 
35d60 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65  dlsym() with -pe
35d70 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20  dantic-errors?. 
35d80 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c   **.  ** Variabl
35d90 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66  e x below is def
35da0 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69  ined to be a poi
35db0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
35dc0 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70  on taking.  ** p
35dd0 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20  arameters void* 
35de0 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  and const char* 
35df0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20  and returning a 
35e00 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
35e10 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69  ction..  ** We i
35e20 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61  nitialize x by a
35e30 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f  ssigning it a po
35e40 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73  inter to the dls
35e50 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  ym() function.. 
35e60 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e   ** (That assign
35e70 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20  ment requires a 
35e80 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20  cast.)  Then we 
35e90 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f  call the functio
35ea0 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f  n that.  ** x po
35eb0 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a  ints to.  .  **.
35ec0 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61    ** This work-a
35ed0 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c  round is unlikel
35ee0 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63  y to work correc
35ef0 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65  tly on any syste
35f00 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75  m where.  ** you
35f10 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63   really cannot c
35f20 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ast a function p
35f30 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64  ointer into void
35f40 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e  *.  But then, on
35f50 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
35f60 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69  hand, dlsym() wi
35f70 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73  ll not work on s
35f80 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74  uch a system eit
35f90 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a  her, so we have.
35fa0 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20    ** not really 
35fb0 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20  lost anything.. 
35fc0 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78   */.  void (*(*x
35fd0 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
35fe0 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55  ar*))(void);.  U
35ff0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36000 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20  NotUsed);.  x = 
36010 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a  (void(*(*)(void*
36020 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
36030 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65  oid))dlsym;.  re
36040 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79  turn (*x)(p, zSy
36050 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  m);.}.static voi
36060 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71  d unixDlClose(sq
36070 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
36080 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  ed, void *pHandl
36090 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
360a0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
360b0 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64  .  dlclose(pHand
360c0 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
360d0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
360e0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
360f0 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
36100 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65  define unixDlOpe
36110 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  n  0.  #define u
36120 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  nixDlError 0.  #
36130 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d  define unixDlSym
36140 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75     0.  #define u
36150 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e  nixDlClose 0.#en
36160 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
36170 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
36180 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68  andom data to th
36190 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
361a0 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
361b0 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d  c int unixRandom
361c0 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
361d0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
361e0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
361f0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
36200 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
36210 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29   assert((size_t)
36220 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69  nBuf>=(sizeof(ti
36230 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74  me_t)+sizeof(int
36240 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61  )));..  /* We ha
36250 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ve to initialize
36260 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74   zBuf to prevent
36270 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72   valgrind from r
36280 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72  eporting.  ** er
36290 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72  rors.  The repor
362a0 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c  ts issued by val
362b0 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72  grind are incorr
362c0 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20  ect - we would. 
362d0 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20   ** prefer that 
362e0 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62  the randomness b
362f0 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d  e increased by m
36300 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65  aking use of the
36310 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69  .  ** uninitiali
36320 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75  zed space in zBu
36330 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64  f - but valgrind
36340 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20   errors tend to 
36350 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20  worry.  ** some 
36360 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74  users.  Rather t
36370 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65  han argue, it se
36380 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20  ems easier just 
36390 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20  to initialize.  
363a0 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72  ** the whole arr
363b0 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76  ay and silence v
363c0 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66  algrind, even if
363d0 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73   that means less
363e0 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a   randomness.  **
363f0 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73   in the random s
36400 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  eed..  **.  ** W
36410 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69  hen testing, ini
36420 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d  tializing zBuf[]
36430 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20   to zero is all 
36440 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61  we do.  That mea
36450 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20  ns.  ** that we 
36460 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73  always use the s
36470 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  ame random numbe
36480 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69  r sequence.  Thi
36490 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a  s makes the.  **
364a0 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c   tests repeatabl
364b0 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  e..  */.  memset
364c0 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
364d0 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  .  randomnessPid
364e0 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 20   = osGetpid(0); 
364f0 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
36500 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 21  QLITE_TEST) && !
36510 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
36520 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a  MIT_RANDOMNESS).
36530 20 20 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c 20    {.    int fd, 
36540 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  got;.    fd = ro
36550 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f  bust_open("/dev/
36560 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e  urandom", O_RDON
36570 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LY, 0);.    if( 
36580 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69  fd<0 ){.      ti
36590 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69  me_t t;.      ti
365a0 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65  me(&t);.      me
365b0 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73  mcpy(zBuf, &t, s
365c0 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20  izeof(t));.     
365d0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
365e0 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f  zeof(t)], &rando
365f0 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a 65 6f 66  mnessPid, sizeof
36600 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29  (randomnessPid))
36610 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
36620 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66  sizeof(t)+sizeof
36630 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c  (randomnessPid)<
36640 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b  =(size_t)nBuf );
36650 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69  .      nBuf = si
36660 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66  zeof(t) + sizeof
36670 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b  (randomnessPid);
36680 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36690 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65    do{ got = osRe
366a0 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
366b0 66 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  f); }while( got<
366c0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
366d0 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73  R );.      robus
366e0 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f  t_close(0, fd, _
366f0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
36700 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
36710 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a  urn nBuf;.}.../*
36720 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
36730 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
36740 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
36750 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
36760 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
36770 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
36780 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65   microseconds we
36790 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a   want to sleep..
367a0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
367b0 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
367c0 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
367d0 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61  s of sleep actua
367e0 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  lly.** requested
367f0 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
36800 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
36810 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20  ystem, a number 
36820 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
36830 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
36840 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
36850 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  rgument, but not
36860 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
36870 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
36880 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c  tatic int unixSl
36890 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
368a0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69  *NotUsed, int mi
368b0 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  croseconds){.#if
368c0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
368d0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70  ruct timespec sp
368e0 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d  ;..  sp.tv_sec =
368f0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20   microseconds / 
36900 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76  1000000;.  sp.tv
36910 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65  _nsec = (microse
36920 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29  conds % 1000000)
36930 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73   * 1000;.  nanos
36940 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b  leep(&sp, NULL);
36950 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
36960 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
36970 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
36980 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  nds;.#elif defin
36990 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
369a0 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
369b0 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63   usleep(microsec
369c0 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
369d0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
369e0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
369f0 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65  roseconds;.#else
36a00 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d  .  int seconds =
36a10 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39   (microseconds+9
36a20 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a  99999)/1000000;.
36a30 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29    sleep(seconds)
36a40 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
36a50 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
36a60 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a   return seconds*
36a70 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  1000000;.#endif.
36a80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
36a90 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
36aa0 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
36ab0 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
36ac0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
36ad0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
36ae0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
36af0 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
36b00 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
36b10 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
36b20 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
36b30 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
36b40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
36b50 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
36b60 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
36b70 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
36b80 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
36b90 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
36ba0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
36bb0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
36bc0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
36bd0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
36be0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74  ime).  Write int
36bf0 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20  o *piNow.** the 
36c00 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
36c10 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
36c20 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d  n Day number tim
36c30 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20  es 86_400_000.  
36c40 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  In.** other word
36c50 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70  s, write into *p
36c60 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20  iNow the number 
36c70 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
36c80 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e  since the Julian
36c90 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f  .** epoch of noo
36ca0 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f  n in Greenwich o
36cb0 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34  n November 24, 4
36cc0 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e  714 B.C accordin
36cd0 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c  g to the.** prol
36ce0 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20  eptic Gregorian 
36cf0 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
36d00 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
36d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52  rn SQLITE_OK.  R
36d20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
36d30 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61  OR if the time a
36d40 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e  nd date .** cann
36d50 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
36d60 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
36d70 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
36d80 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
36d90 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  Used, sqlite3_in
36da0 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73  t64 *piNow){.  s
36db0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
36dc0 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
36dd0 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
36de0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
36df0 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20  40000;.  int rc 
36e00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66  = SQLITE_OK;.#if
36e10 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54   defined(NO_GETT
36e20 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a  OD).  time_t t;.
36e30 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70    time(&t);.  *p
36e40 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33  iNow = ((sqlite3
36e50 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b  _int64)t)*1000 +
36e60 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69   unixEpoch;.#eli
36e70 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
36e80 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
36e90 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74  Now;.  clock_get
36ea0 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54  time(CLOCK_REALT
36eb0 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a  IME, &sNow);.  *
36ec0 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
36ed0 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
36ee0 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
36ef0 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73  sec + sNow.tv_ns
36f00 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73  ec/1000000;.#els
36f10 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
36f20 61 6c 20 73 4e 6f 77 3b 0a 20 20 28 76 6f 69 64  al sNow;.  (void
36f30 29 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73  )gettimeofday(&s
36f40 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a 20 43 61 6e  Now, 0);  /* Can
36f50 6e 6f 74 20 66 61 69 6c 20 67 69 76 65 6e 20 76  not fail given v
36f60 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  alid arguments *
36f70 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  /.  *piNow = uni
36f80 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
36f90 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
36fa0 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
36fb0 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65  tv_usec/1000;.#e
36fc0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
36fd0 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
36fe0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
36ff0 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
37000 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
37010 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
37020 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
37030 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
37040 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
37050 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
37060 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
37070 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
37080 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
37090 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
370a0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
370b0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
370c0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
370d0 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
370e0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
370f0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
37100 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
37110 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
37120 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
37130 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
37140 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
37150 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
37160 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
37170 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
37180 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
37190 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69   *prNow){.  sqli
371a0 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b  te3_int64 i = 0;
371b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55  .  int rc;.  UNU
371c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
371d0 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75  tUsed);.  rc = u
371e0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
371f0 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70  t64(0, &i);.  *p
37200 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
37210 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0.0;.  return rc
37220 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
37230 6e 65 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  ne unixCurrentTi
37240 6d 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  me 0.#endif../*.
37250 2a 2a 20 54 68 65 20 78 47 65 74 4c 61 73 74 45  ** The xGetLastE
37260 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 69 73  rror() method is
37270 20 64 65 73 69 67 6e 65 64 20 74 6f 20 72 65 74   designed to ret
37280 75 72 6e 20 61 20 62 65 74 74 65 72 0a 2a 2a 20  urn a better.** 
37290 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
372a0 6d 65 73 73 61 67 65 20 77 68 65 6e 20 6f 70 65  message when ope
372b0 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72  rating-system pr
372c0 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a  oblems come up.*
372d0 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20  * during SQLite 
372e0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79  operation.  Only
372f0 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 65 74   the integer ret
37300 75 72 6e 20 63 6f 64 65 20 69 73 20 63 75 72 72  urn code is curr
37310 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a  ently.** used..*
37320 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
37330 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
37340 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
37350 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
37360 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33  , char *NotUsed3
37370 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
37380 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
37390 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
373a0 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  ER(NotUsed2);.  
373b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
373c0 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65  (NotUsed3);.  re
373d0 74 75 72 6e 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a  turn errno;.}...
373e0 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
373f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
37400 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  of sqlite3_vfs m
37410 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
37420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37430 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
37440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37480 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
37490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
374a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
374b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
374c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
374d0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
374e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
374f0 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69  egin Proxy Locki
37500 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
37510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37520 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ***.**.** Proxy 
37530 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62  locking is a "ub
37540 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f  er-locking-metho
37550 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65  d" in this sense
37560 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a  :  It uses the.*
37570 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  * other locking 
37580 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e  methods on secon
37590 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e  dary lock files.
375a0 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20    Proxy locking 
375b0 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79  is a.** meta-lay
375c0 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74  er over top of t
375d0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
375e0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64  king implemented
375f0 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20   above.  For.** 
37600 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
37610 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
37620 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f  mplements of pro
37630 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65  xy locking is de
37640 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20  ferred.** until 
37650 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65  late in the file
37660 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c   (here) after al
37670 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49  l of the other I
37680 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a  /O methods have.
37690 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20  ** been defined 
376a0 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72  - so that the pr
376b0 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
376c0 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69  methods are avai
376d0 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76  lable.** as serv
376e0 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74  ices to help wit
376f0 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  h the implementa
37700 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f  tion of proxy lo
37710 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a  cking..**.****.*
37720 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
37730 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
37740 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62   in SQLite use b
37750 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
37760 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
37770 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64  se file to coord
37780 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63  inate safe, conc
37790 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79  urrent access by
377a0 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
377b0 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73  s.** and writers
377c0 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e   [http://sqlite.
377d0 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74  org/lockingv3.ht
377e0 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66  ml].  The five f
377f0 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  ile locking.** s
37800 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c  tates (UNLOCKED,
37810 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44   PENDING, SHARED
37820 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c  , RESERVED, EXCL
37830 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65  USIVE) are imple
37840 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53  mented.** as POS
37850 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20  IX read & write 
37860 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64  locks over fixed
37870 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e   set of location
37880 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a  s (via fsctl),.*
37890 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42  * on AFP and SMB
378a0 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20   only exclusive 
378b0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
378c0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76   are available v
378d0 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68  ia fsctl.** with
378e0 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
378f0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
37900 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63  LockPB2) to trac
37910 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61  k the same 5 sta
37920 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c  tes..** To simul
37930 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e  ate a F_RDLCK on
37940 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
37950 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64  e, on AFP a rand
37960 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a  omly selected.**
37970 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
37980 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
37990 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52  taken for a SHAR
379a0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74  ED lock, the ent
379b0 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61  ire.** shared ra
379c0 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
379d0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
379e0 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ck):.**.**      
379f0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20  PENDING_BYTE    
37a00 20 20 20 20 30 78 34 30 30 30 30 30 30 30 0a 2a      0x40000000.*
37a10 2a 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f  *      RESERVED_
37a20 42 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30  BYTE       0x400
37a30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48  00001.**      SH
37a40 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20  ARED_RANGE      
37a50 20 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20    0x40000002 -> 
37a60 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a  0x40000200.**.**
37a70 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c   This works well
37a80 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
37a90 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73  le system, but s
37aa0 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30  hows a nearly 10
37ab0 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69  0x.** slowdown i
37ac0 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e  n read performan
37ad0 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73  ce on AFP becaus
37ae0 65 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74  e the AFP client
37af0 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65   disables.** the
37b00 20 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e   read cache when
37b10 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
37b20 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20  s are present.  
37b30 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61  Enabling the rea
37b40 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73  d.** cache expos
37b50 65 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72  es a cache coher
37b60 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61  ency problem tha
37b70 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20  t is present on 
37b80 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70  all OS X.** supp
37b90 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69  orted network fi
37ba0 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53  le systems.  NFS
37bb0 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62   and AFP both ob
37bc0 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f  serve the.** clo
37bd0 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e  se-to-open seman
37be0 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e  tics for ensurin
37bf0 67 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  g cache coherenc
37c00 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73  y.** [http://nfs
37c10 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  .sourceforge.net
37c20 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68  /#faq_a8], which
37c30 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74   does not effect
37c40 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73  ively.** address
37c50 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
37c60 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74  s for concurrent
37c70 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
37c80 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20   by multiple.** 
37c90 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
37ca0 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77  ers.** [http://w
37cb0 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51  ww.nabble.com/SQ
37cc0 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68  Lite-on-NFS-cach
37cd0 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35  e-coherency-td15
37ce0 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a  655701.html]..**
37cf0 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74  .** To address t
37d00 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61  he performance a
37d10 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e  nd cache coheren
37d20 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79  cy issues, proxy
37d30 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
37d40 20 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79   changes the way
37d50 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
37d60 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62   is controlled b
37d70 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73  y limiting acces
37d80 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  s to a.** single
37d90 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20   host at a time 
37da0 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20  and moving file 
37db0 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65  locks off of the
37dc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
37dd0 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f  * and onto a pro
37de0 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c  xy file on the l
37df0 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
37e00 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69  .  .**.**.** Usi
37e10 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a  ng proxy locks.*
37e20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
37e30 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73  ---.**.** C APIs
37e40 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  .**.**  sqlite3_
37e50 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
37e60 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
37e70 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52  FCNTL_SET_LOCKPR
37e80 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
37e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ea0 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c    <proxy_path> |
37eb0 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20   ":auto:");.**  
37ec0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
37ed0 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
37ee0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
37ef0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
37f00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
37f10 20 20 20 20 20 20 20 20 20 20 26 3c 70 72 6f 78            &<prox
37f20 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
37f30 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
37f40 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
37f50 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
37f60 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
37f70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
37f80 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
37f90 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
37fa0 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
37fb0 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
37fc0 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
37fd0 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
37fe0 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
37ff0 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
38000 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
38010 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
38020 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
38030 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
38040 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
38050 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
38060 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
38070 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
38080 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
38090 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
380a0 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
380b0 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
380c0 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
380d0 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
380e0 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
380f0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
38100 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
38110 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
38120 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
38130 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
38140 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
38150 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
38160 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
38170 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
38180 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
38190 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
381a0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
381b0 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
381c0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
381d0 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
381e0 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
381f0 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
38200 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
38210 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
38220 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
38230 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
38240 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
38250 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
38260 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
38270 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
38280 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
38290 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
382a0 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
382b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
382c0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
382d0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
382e0 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
382f0 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
38300 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
38310 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
38320 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
38330 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
38340 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
38350 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
38360 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
38370 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
38380 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
38390 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
383a0 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
383b0 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
383c0 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
383d0 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
383e0 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
383f0 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
38400 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
38410 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
38420 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
38430 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
38440 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
38450 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
38460 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
38470 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
38480 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
38490 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
384a0 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
384b0 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
384c0 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
384d0 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
384e0 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
384f0 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
38500 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
38510 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
38520 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
38530 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
38540 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
38550 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
38560 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
38570 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
38580 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
38590 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
385a0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
385b0 2c 20 6f 72 20 69 74 73 20 63 6f 6e 74 65 6e 74  , or its content
385c0 73 20 64 6f 20 6e 6f 74