/ Hex Artifact Content
Login

Artifact 30e2c43e4955db990e5b5a81e901f8aa74cc8820:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ce0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0cf0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0d00: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0d10: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0d20: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0d30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0d40: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0d50: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0d60: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0d70: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0d80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0d90: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0da0: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0db0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0dc0: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0de0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0df0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0e00: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0e10: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0e20: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0e30: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0e40: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0e50: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0e70: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0e80: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0e90: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0ea0: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0eb0: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0ec0: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0ed0: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0ee0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0ef0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0f00: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0f10: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0f20: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0f30: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0f40: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0f50: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0f60: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0f70: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0f80: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0f90: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0fa0: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0fb0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0fc0: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0fd0: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0fe0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0ff0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
1000: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1010: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
1020: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1030: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
1040: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
1050: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
1060: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
1070: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
1080: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
1090: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
10a0: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
10b0: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
10c0: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
10d0: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
10e0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
10f0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
1100: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
1110: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
1120: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
1130: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1140: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1150: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1160: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1170: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1180: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1190: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
11a0: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
11b0: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
11c0: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
11d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
11e0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
11f0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
1200: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
1210: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
1220: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1230: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1240: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1250: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1260: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1270: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1280: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1290: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
12a0: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
12b0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
12c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
12d0: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
12e0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
12f0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
1300: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a  HNAME 512../*.**
1310: 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   Maximum support
1320: 65 64 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  ed symbolic link
1330: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  s.*/.#define SQL
1340: 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53  ITE_MAX_SYMLINKS
1350: 20 31 30 30 0a 0a 2f 2a 20 41 6c 77 61 79 73 20   100../* Always 
1360: 63 61 73 74 20 74 68 65 20 67 65 74 70 69 64 28  cast the getpid(
1370: 29 20 72 65 74 75 72 6e 20 74 79 70 65 20 66 6f  ) return type fo
1380: 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  r compatibility 
1390: 77 69 74 68 0a 2a 2a 20 6b 65 72 6e 65 6c 20 6d  with.** kernel m
13a0: 6f 64 75 6c 65 73 20 69 6e 20 56 78 57 6f 72 6b  odules in VxWork
13b0: 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 6f 73  s. */.#define os
13c0: 47 65 74 70 69 64 28 58 29 20 28 70 69 64 5f 74  Getpid(X) (pid_t
13d0: 29 67 65 74 70 69 64 28 29 0a 0a 2f 2a 0a 2a 2a  )getpid()../*.**
13e0: 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61   Only set the la
13f0: 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65  stErrno if the e
1400: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72  rror code is a r
1410: 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f  eal error and no
1420: 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65  t .** a normal e
1430: 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63  xpected return c
1440: 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55  ode of SQLITE_BU
1450: 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a  SY or SQLITE_OK.
1460: 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f  */.#define IS_LO
1470: 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78  CK_ERROR(x)  ((x
1480: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26   != SQLITE_OK) &
1490: 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42  & (x != SQLITE_B
14a0: 55 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72  USY))../* Forwar
14b0: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
14c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
14d0: 6e 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20  nixShm unixShm; 
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14f0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72   Connection shar
1500: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70  ed memory */.typ
1510: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
1520: 53 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e  ShmNode unixShmN
1530: 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68  ode;       /* Sh
1540: 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74  ared memory inst
1550: 61 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20  ance */.typedef 
1560: 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65  struct unixInode
1570: 49 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e  Info unixInodeIn
1580: 66 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f  fo;   /* An i-no
1590: 64 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  de */.typedef st
15a0: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
15b0: 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20  d UnixUnusedFd; 
15c0: 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64      /* An unused
15d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15e0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74   */../*.** Somet
15f0: 69 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69  imes, after a fi
1600: 6c 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f  le handle is clo
1610: 73 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74  sed by SQLite, t
1620: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1630: 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  or.** cannot be 
1640: 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65  closed immediate
1650: 6c 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73  ly. In these cas
1660: 65 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  es, instances of
1670: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1680: 2a 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20  * structure are 
1690: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
16a0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16b0: 72 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20  r while waiting 
16c0: 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74  for an.** opport
16d0: 75 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20  unity to either 
16e0: 63 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69  close or reuse i
16f0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69  t..*/.struct Uni
1700: 78 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e  xUnusedFd {.  in
1710: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
1720: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1730: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c  descriptor to cl
1740: 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ose */.  int fla
1750: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1760: 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73     /* Flags this
1770: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1780: 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68   was opened with
1790: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
17a0: 46 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  Fd *pNext;      
17b0: 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66  /* Next unused f
17c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
17d0: 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d  n same file */.}
17e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69  ;../*.** The uni
17f0: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
1800: 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73  is subclass of s
1810: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63  qlite3_file spec
1820: 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78  ific to the unix
1830: 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  .** VFS implemen
1840: 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65  tations..*/.type
1850: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46  def struct unixF
1860: 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74  ile unixFile;.st
1870: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a  ruct unixFile {.
1880: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
1890: 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74  hods const *pMet
18a0: 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  hod;  /* Always 
18b0: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
18c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
18d0: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
18e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18f0: 56 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64  VFS that created
1900: 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a   this unixFile *
1910: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
1920: 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
1930: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
1940: 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74  about locks on t
1950: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69  his inode */.  i
1960: 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
1990: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75  escriptor */.  u
19a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69  nsigned char eFi
19b0: 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  leLock;         
19c0: 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f     /* The type o
19d0: 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  f lock held on t
19e0: 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69  his fd */.  unsi
19f0: 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63  gned short int c
1a00: 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
1a10: 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69  /* Behavioral bi
1a20: 74 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20  ts.  UNIXFILE_* 
1a30: 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c  flags */.  int l
1a40: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a60: 2a 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f  * The unix errno
1a70: 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65   from last I/O e
1a80: 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  rror */.  void *
1a90: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab0: 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73   Locking style s
1ac0: 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f  pecific state */
1ad0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
1ae0: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
1af0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c         /* Pre-al
1b00: 6c 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73  located UnixUnus
1b10: 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  edFd */.  const 
1b20: 63 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20  char *zPath;    
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
1b50: 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  e */.  unixShm *
1b60: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
1b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1b80: 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d  ared memory segm
1b90: 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ent information 
1ba0: 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b  */.  int szChunk
1bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
1bd0: 69 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f  igured by FCNTL_
1be0: 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69  CHUNK_SIZE */.#i
1bf0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1c00: 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e  P_SIZE>0.  int n
1c10: 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20  FetchOut;       
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  * Number of outs
1c40: 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20 72  tanding xFetch r
1c50: 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  efs */.  sqlite3
1c60: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b  _int64 mmapSize;
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c80: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d  Usable size of m
1c90: 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65  apping at pMapRe
1ca0: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gion */.  sqlite
1cb0: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
1cc0: 41 63 74 75 61 6c 3b 20 20 20 20 20 20 20 2f 2a  Actual;       /*
1cd0: 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   Actual size of 
1ce0: 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52  mapping at pMapR
1cf0: 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  egion */.  sqlit
1d00: 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a  e3_int64 mmapSiz
1d10: 65 4d 61 78 3b 20 20 20 20 20 20 20 20 20 20 2f  eMax;          /
1d20: 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e  * Configured FCN
1d30: 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c  TL_MMAP_SIZE val
1d40: 75 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d  ue */.  void *pM
1d50: 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1d70: 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65 67  emory mapped reg
1d80: 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ion */.#endif.#i
1d90: 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
1da0: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
1db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
1dd0: 73 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  sector size */. 
1de0: 20 69 6e 74 20 64 65 76 69 63 65 43 68 61 72 61   int deviceChara
1df0: 63 74 65 72 69 73 74 69 63 73 3b 20 20 20 20 20  cteristics;     
1e00: 20 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75       /* Precompu
1e10: 74 65 64 20 64 65 76 69 63 65 20 63 68 61 72 61  ted device chara
1e20: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23 65  cteristics */.#e
1e30: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1e40: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1e50: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1e60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e80: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1e90: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1ea0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1eb0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1ec0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1ed0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1ee0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1f10: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1f20: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1f30: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
1f40: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
1f50: 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20  d *pId;         
1f60: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
1f70: 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ID */.#endif.#if
1f80: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1f90: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67  .  /* The next g
1fa0: 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65  roup of variable
1fb0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  s are used to tr
1fc0: 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ack whether or n
1fd0: 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  ot the.  ** tran
1fe0: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1ff0: 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f  in bytes 24-27 o
2000: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  f database files
2010: 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a   are updated.  *
2020: 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70  * whenever any p
2030: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
2040: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e  ase changes.  An
2050: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74   assertion fault
2060: 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72   will.  ** occur
2070: 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70   if a file is up
2080: 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c  dated without al
2090: 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20  so updating the 
20a0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
20b0: 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
20c0: 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20  test is made to 
20d0: 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65  avoid new proble
20e0: 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  ms similar to th
20f0: 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72  e.  ** one descr
2100: 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  ibed by ticket #
2110: 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e  3584. .  */.  un
2120: 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e  signed char tran
2130: 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20  sCntrChng;   /* 
2140: 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e  True if the tran
2150: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
2160: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2170: 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64  igned char dbUpd
2180: 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ate;        /* T
2190: 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20  rue if any part 
21a0: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
21b0: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
21c0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f  signed char inNo
21d0: 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20  rmalWrite;   /* 
21e0: 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72  True if in a nor
21f0: 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74  mal write operat
2200: 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a  ion */..#endif..
2210: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2220: 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20  ST.  /* In test 
2230: 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74  mode, increase t
2240: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20  he size of this 
2250: 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20  structure a bit 
2260: 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74  so that .  ** it
2270: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2280: 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68  the struct Crash
2290: 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20  File defined in 
22a0: 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20  test6.c..  */.  
22b0: 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32  char aPadding[32
22c0: 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  ];.#endif.};../*
22d0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68   This variable h
22e0: 6f 6c 64 73 20 74 68 65 20 70 72 6f 63 65 73 73  olds the process
22f0: 20 69 64 20 28 70 69 64 29 20 66 72 6f 6d 20 77   id (pid) from w
2300: 68 65 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e  hen the xRandomn
2310: 65 73 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  ess().** method 
2320: 77 61 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20  was called.  If 
2330: 78 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65  xOpen() is calle
2340: 64 20 66 72 6f 6d 20 61 20 64 69 66 66 65 72 65  d from a differe
2350: 6e 74 20 70 72 6f 63 65 73 73 20 69 64 2c 0a 2a  nt process id,.*
2360: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  * indicating tha
2370: 74 20 61 20 66 6f 72 6b 28 29 20 68 61 73 20 6f  t a fork() has o
2380: 63 63 75 72 72 65 64 2c 20 74 68 65 20 50 52 4e  ccurred, the PRN
2390: 47 20 77 69 6c 6c 20 62 65 20 72 65 73 65 74 2e  G will be reset.
23a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 70 69 64 5f 74  .*/.static pid_t
23b0: 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
23c0: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77   0;../*.** Allow
23d0: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  ed values for th
23e0: 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46  e unixFile.ctrlF
23f0: 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f  lags bitmask:.*/
2400: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2410: 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20 30 78  E_EXCL        0x
2420: 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  01     /* Connec
2430: 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70  tions from one p
2440: 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23  rocess only */.#
2450: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2460: 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32  RDONLY      0x02
2470: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
2480: 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20  on is read only 
2490: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
24a0: 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20  ILE_PERSIST_WAL 
24b0: 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73  0x04     /* Pers
24c0: 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20  istent WAL mode 
24d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
24e0: 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
24f0: 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46  C.# define UNIXF
2500: 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30  ILE_DIRSYNC    0
2510: 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63  x08     /* Direc
2520: 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64  tory sync needed
2530: 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69   */.#else.# defi
2540: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53  ne UNIXFILE_DIRS
2550: 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64  YNC    0x00.#end
2560: 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  if.#define UNIXF
2570: 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20  ILE_PSOW        
2580: 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49  0x10     /* SQLI
2590: 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
25a0: 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a  FE_OVERWRITE */.
25b0: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
25c0: 5f 44 45 4c 45 54 45 20 20 20 20 20 20 30 78 32  _DELETE      0x2
25d0: 30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  0     /* Delete 
25e0: 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66  on close */.#def
25f0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49  ine UNIXFILE_URI
2600: 20 20 20 20 20 20 20 20 20 30 78 34 30 20 20 20           0x40   
2610: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69    /* Filename mi
2620: 67 68 74 20 68 61 76 65 20 71 75 65 72 79 20 70  ght have query p
2630: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65  arameters */.#de
2640: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  fine UNIXFILE_NO
2650: 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30 20 20  LOCK      0x80  
2660: 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65     /* Do no file
2670: 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a   locking */../*.
2680: 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20  ** Include code 
2690: 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  that is common t
26a0: 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c  o all os_*.c fil
26b0: 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  es.*/.#include "
26c0: 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a  os_common.h"../*
26d0: 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f  .** Define vario
26e0: 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61  us macros that a
26f0: 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  re missing from 
2700: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  some systems..*/
2710: 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .#ifndef O_LARGE
2720: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
2730: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2740: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2750: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75  _DISABLE_LFS.# u
2760: 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45  ndef O_LARGEFILE
2770: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47  .# define O_LARG
2780: 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23  EFILE 0.#endif.#
2790: 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f  ifndef O_NOFOLLO
27a0: 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46  W.# define O_NOF
27b0: 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23  OLLOW 0.#endif.#
27c0: 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a  ifndef O_BINARY.
27d0: 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52  # define O_BINAR
27e0: 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  Y 0.#endif../*.*
27f0: 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d  * The threadid m
2800: 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f  acro resolves to
2810: 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f   the thread-id o
2820: 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f  r to 0.  Used fo
2830: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
2840: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
2850: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
2860: 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e  HREADSAFE.#defin
2870: 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65  e threadid pthre
2880: 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a  ad_self().#else.
2890: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
28a0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
28b0: 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66   HAVE_MREMAP def
28c0: 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e  aults to true on
28d0: 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65   Linux and false
28e0: 20 65 76 65 72 79 77 68 65 72 65 20 65 6c 73 65   everywhere else
28f0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
2900: 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23  d(HAVE_MREMAP).#
2910: 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   if defined(__li
2920: 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65  nux__) && define
2930: 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23  d(_GNU_SOURCE).#
2940: 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52    define HAVE_MR
2950: 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20  EMAP 1.# else.# 
2960: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45   define HAVE_MRE
2970: 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65  MAP 0.# endif.#e
2980: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c  ndif../*.** Expl
2990: 69 63 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20  icitly call the 
29a0: 36 34 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f  64-bit version o
29b0: 66 20 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64  f lseek() on And
29c0: 72 6f 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  roid. Otherwise,
29d0: 20 6c 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74   lseek().** is t
29e0: 68 65 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f  he 32-bit versio
29f0: 6e 2c 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45  n, even if _FILE
2a00: 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20  _OFFSET_BITS=64 
2a10: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
2a20: 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f  ifdef __ANDROID_
2a30: 5f 0a 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b  _.# define lseek
2a40: 20 6c 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a   lseek64.#endif.
2a50: 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ./*.** Different
2a60: 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65   Unix systems de
2a70: 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20  clare open() in 
2a80: 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20  different ways. 
2a90: 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65   Same use.** ope
2aa0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
2ab0: 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65  t,mode_t).  Othe
2ac0: 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73  rs use open(cons
2ad0: 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29  t char*,int,...)
2ae0: 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  ..** The differe
2af0: 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  nce is important
2b00: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f   when using a po
2b10: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e  inter to the fun
2b20: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
2b30: 20 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64   safest way to d
2b40: 65 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f  eal with the pro
2b50: 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79  blem is to alway
2b60: 73 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70  s use this wrapp
2b70: 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61  er.** which alwa
2b80: 79 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ys has the same 
2b90: 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74  well-defined int
2ba0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
2bb0: 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28  c int posixOpen(
2bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2bd0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e  e, int flags, in
2be0: 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72  t mode){.  retur
2bf0: 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c  n open(zFile, fl
2c00: 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f  ags, mode);.}../
2c10: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
2c20: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
2c30: 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
2c40: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
2c50: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75  *);.static int u
2c60: 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76  nixGetpagesize(v
2c70: 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e  oid);../*.** Man
2c80: 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61  y system calls a
2c90: 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f  re accessed thro
2ca0: 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66  ugh pointer-to-f
2cb0: 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  unctions so that
2cc0: 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20  .** they may be 
2cd0: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
2ce0: 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74  ntime to facilit
2cf0: 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  ate fault inject
2d00: 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65  ion during.** te
2d10: 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f  sting and sandbo
2d20: 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  xing.  The follo
2d30: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
2d40: 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70   the names and p
2d50: 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c  ointers.** to al
2d60: 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  l overrideable s
2d70: 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  ystem calls..*/.
2d80: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e  static struct un
2d90: 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63  ix_syscall {.  c
2da0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2dc0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74  Name of the syst
2dd0: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
2de0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2df0: 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75   pCurrent; /* Cu
2e00: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
2e10: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
2e20: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
2e30: 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74  all_ptr pDefault
2e40: 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  ; /* Default val
2e50: 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c  ue */.} aSyscall
2e60: 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e  [] = {.  { "open
2e70: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
2e80: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2e90: 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d  posixOpen,  0  }
2ea0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
2eb0: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
2ec0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69  onst char*,int,i
2ed0: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e  nt))aSyscall[0].
2ee0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2ef0: 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28  close",        (
2f00: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2f10: 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20  ptr)close,      
2f20: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2f30: 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28  Close     ((int(
2f40: 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  *)(int))aSyscall
2f50: 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [1].pCurrent).. 
2f60: 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20   { "access",    
2f70: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2f80: 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20  all_ptr)access, 
2f90: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2fa0: 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28  e osAccess    ((
2fb0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
2fc0: 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  r*,int))aSyscall
2fd0: 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [2].pCurrent).. 
2fe0: 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20   { "getcwd",    
2ff0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3000: 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20  all_ptr)getcwd, 
3010: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3020: 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28  e osGetcwd    ((
3030: 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73  char*(*)(char*,s
3040: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3050: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  3].pCurrent)..  
3060: 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20  { "stat",       
3070: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3080: 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20  ll_ptr)stat,    
3090: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
30a0: 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69   osStat      ((i
30b0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
30c0: 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  *,struct stat*))
30d0: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
30e0: 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rent)../*.** The
30f0: 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20   DJGPP compiler 
3100: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b  environment look
3110: 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e  s mostly like Un
3120: 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61  ix, but it.** la
3130: 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20  cks the fcntl() 
3140: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f  system call.  So
3150: 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28   redefine fcntl(
3160: 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  ) to be somethin
3170: 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73  g.** that always
3180: 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73   succeeds.  This
3190: 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b   means that lock
31a0: 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ing does not occ
31b0: 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50  ur under.** DJGP
31c0: 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f  P.  But it is DO
31d0: 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75  S - what did you
31e0: 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64   expect?.*/.#ifd
31f0: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b  ef __DJGPP__.  {
3200: 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20   "fstat",       
3210: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
3220: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3230: 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29  e osFstat(a,b,c)
3240: 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20      0.#else     
3250: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
3260: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3270: 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c  scall_ptr)fstat,
3280: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
3290: 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20  ine osFstat     
32a0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72  ((int(*)(int,str
32b0: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
32c0: 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29  all[5].pCurrent)
32d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74  .#endif..  { "ft
32e0: 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71  runcate",    (sq
32f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3300: 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20  r)ftruncate,  0 
3310: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74   },.#define osFt
3320: 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29  runcate ((int(*)
3330: 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  (int,off_t))aSys
3340: 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74  call[6].pCurrent
3350: 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20  )..  { "fcntl", 
3360: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3370: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74  syscall_ptr)fcnt
3380: 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  l,      0  },.#d
3390: 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20  efine osFcntl   
33a0: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69    ((int(*)(int,i
33b0: 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  nt,...))aSyscall
33c0: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [7].pCurrent).. 
33d0: 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20   { "read",      
33e0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
33f0: 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20  all_ptr)read,   
3400: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3410: 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28  e osRead      ((
3420: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
3430: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3440: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
3450: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3460: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51  USE_PREAD) || SQ
3470: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
3480: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70  ING_STYLE.  { "p
3490: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
34a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34b0: 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30  tr)pread,      0
34c0: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
34d0: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
34e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
34f0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3500: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3510: 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20  fine osPread    
3520: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3530: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3540: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39  ff_t))aSyscall[9
3550: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3560: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3570: 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64  AD64).  { "pread
3580: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3590: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
35a0: 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c  read64,    0  },
35b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61  .#else.  { "prea
35c0: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
35d0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35e0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
35f0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3600: 20 6f 73 50 72 65 61 64 36 34 20 28 28 73 73 69   osPread64 ((ssi
3610: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
3620: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74  *,size_t,off64_t
3630: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
3640: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77  Current)..  { "w
3650: 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73  rite",        (s
3660: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3670: 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30  tr)write,      0
3680: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57    },.#define osW
3690: 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65  rite     ((ssize
36a0: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
36b0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
36c0: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
36d0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
36e0: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
36f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
3700: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20  CKING_STYLE.  { 
3710: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
3720: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3730: 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20  _ptr)pwrite,    
3740: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
3750: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
3760: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3770: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3780: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
3790: 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20  define osPwrite 
37a0: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
37b0: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
37c0: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a  size_t,off_t))\.
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d      aSyscall[12]
37f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3800: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3810: 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65  D64).  { "pwrite
3820: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3830: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77  3_syscall_ptr)pw
3840: 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a  rite64,   0  },.
3850: 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74  #else.  { "pwrit
3860: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
3870: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3880: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3890: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
38a0: 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73  osPwrite64  ((ss
38b0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e  ize_t(*)(int,con
38c0: 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  st void*,size_t,
38d0: 6f 66 66 36 34 5f 74 29 29 5c 0a 20 20 20 20 20  off64_t))\.     
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
38f0: 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72  Syscall[13].pCur
3900: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d  rent)..  { "fchm
3910: 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  od",       (sqli
3920: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3930: 66 63 68 6d 6f 64 2c 20 20 20 20 20 20 20 20 20  fchmod,         
3940: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3950: 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74  sFchmod    ((int
3960: 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29  (*)(int,mode_t))
3970: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
3980: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3990: 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
39a0: 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
39b0: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
39c0: 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  E.  { "fallocate
39d0: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
39e0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
39f0: 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d  _fallocate,  0 }
3a00: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c  ,.#else.  { "fal
3a10: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  locate",    (sql
3a20: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3a30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3a40: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
3a50: 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61  define osFalloca
3a60: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
3a70: 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  off_t,off_t))aSy
3a80: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
3a90: 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b  nt)..  { "unlink
3aa0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3ab0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e  3_syscall_ptr)un
3ac0: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20  link,           
3ad0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55  0 },.#define osU
3ae0: 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a  nlink    ((int(*
3af0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61  )(const char*))a
3b00: 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72  Syscall[16].pCur
3b10: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e  rent)..  { "open
3b20: 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28  Directory",    (
3b30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3b40: 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72  ptr)openDirector
3b50: 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65  y,      0 },.#de
3b60: 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63  fine osOpenDirec
3b70: 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f  tory ((int(*)(co
3b80: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29  nst char*,int*))
3b90: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
3ba0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64  rrent)..  { "mkd
3bb0: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3bc0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3bd0: 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20  )mkdir,         
3be0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3bf0: 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74  sMkdir     ((int
3c00: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
3c10: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3c20: 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [18].pCurrent)..
3c30: 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20    { "rmdir",    
3c40: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c50: 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20  call_ptr)rmdir, 
3c60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c70: 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20  define osRmdir  
3c80: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3c90: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
3ca0: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
3cb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
3cc0: 45 5f 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 66  E_FCHOWN).  { "f
3cd0: 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73  chown",       (s
3ce0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3cf0: 74 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20  tr)fchown,      
3d00: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3d10: 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20   { "fchown",    
3d20: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3d30: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3d40: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3d50: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46  ndif.#define osF
3d60: 63 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a  chown    ((int(*
3d70: 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f  )(int,uid_t,gid_
3d80: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e  t))aSyscall[20].
3d90: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3da0: 67 65 74 65 75 69 64 22 2c 20 20 20 20 20 20 28  geteuid",      (
3db0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3dc0: 70 74 72 29 67 65 74 65 75 69 64 2c 20 20 20 20  ptr)geteuid,    
3dd0: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3de0: 65 20 6f 73 47 65 74 65 75 69 64 20 20 20 28 28  e osGeteuid   ((
3df0: 75 69 64 5f 74 28 2a 29 28 76 6f 69 64 29 29 61  uid_t(*)(void))a
3e00: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
3e10: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
3e20: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3e30: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
3e40: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
3e50: 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20   { "mmap",      
3e60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3e70: 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20  all_ptr)mmap,   
3e80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3e90: 6c 73 65 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20  lse.  { "mmap", 
3ea0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3eb0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3ed0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3ee0: 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a  e osMmap ((void*
3ef0: 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  (*)(void*,size_t
3f00: 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66  ,int,int,int,off
3f10: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  _t))aSyscall[22]
3f20: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3f30: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3f40: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
3f50: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
3f60: 45 3e 30 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22  E>0.  { "munmap"
3f70: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3f80: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75 6e  _syscall_ptr)mun
3f90: 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  map,          0 
3fa0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 75  },.#else.  { "mu
3fb0: 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  nmap",       (sq
3fc0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3fd0: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
3fe0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
3ff0: 64 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20  define osMunmap 
4000: 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a  ((void*(*)(void*
4010: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
4020: 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[23].pCurrent).
4030: 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
4040: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
4050: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
4060: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
4070: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 6d  P_SIZE>0).  { "m
4080: 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73  remap",       (s
4090: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
40a0: 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20 20 20  tr)mremap,      
40b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
40c0: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
40d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
40e0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
40f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4100: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d  ndif.#define osM
4110: 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29  remap ((void*(*)
4120: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69  (void*,size_t,si
4130: 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  ze_t,int,...))aS
4140: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
4150: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
4160: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
4170: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
4180: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
4190: 7b 20 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c  { "getpagesize",
41a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
41b0: 6c 6c 5f 70 74 72 29 75 6e 69 78 47 65 74 70 61  ll_ptr)unixGetpa
41c0: 67 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23 65 6c  gesize, 0 },.#el
41d0: 73 65 0a 20 20 7b 20 22 67 65 74 70 61 67 65 73  se.  { "getpages
41e0: 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33 5f  ize",  (sqlite3_
41f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4210: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
4220: 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28   osGetpagesize (
4230: 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53  (int(*)(void))aS
4240: 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72  yscall[25].pCurr
4250: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4260: 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29  d(HAVE_READLINK)
4270: 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c  .  { "readlink",
4280: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
4290: 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 6c 69  scall_ptr)readli
42a0: 6e 6b 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  nk,        0 },.
42b0: 23 65 6c 73 65 0a 20 20 7b 20 22 72 65 61 64 6c  #else.  { "readl
42c0: 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74  ink",     (sqlit
42d0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
42e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
42f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
4300: 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b 20 28  ine osReadlink (
4310: 28 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f 6e 73  (ssize_t(*)(cons
4320: 74 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c 73 69  t char*,char*,si
4330: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ze_t))aSyscall[2
4340: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
4350: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c  f defined(HAVE_L
4360: 53 54 41 54 29 0a 20 20 7b 20 22 6c 73 74 61 74  STAT).  { "lstat
4370: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
4380: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
4390: 6c 73 74 61 74 2c 20 20 20 20 20 20 20 20 20 20  lstat,          
43a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
43b0: 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20  lstat",         
43c0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
43d0: 5f 70 74 72 29 30 2c 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 4c 73 74 61 74  .#define osLstat
4400: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
4410: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63  onst char*,struc
4420: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
4430: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
4440: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
4450: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
4460: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
4470: 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73  ./*.** On some s
4480: 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f  ystems, calls to
4490: 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74   fchown() will t
44a0: 72 69 67 67 65 72 20 61 20 6d 65 73 73 61 67 65  rigger a message
44b0: 20 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a   in a security.*
44c0: 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f  * log if they co
44d0: 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74  me from non-root
44e0: 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20   processes.  So 
44f0: 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63  avoid calling fc
4500: 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20  hown() if.** we 
4510: 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20  are not running 
4520: 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74  as root..*/.stat
4530: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 46 63 68  ic int robustFch
4540: 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f  own(int fd, uid_
4550: 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64  t uid, gid_t gid
4560: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  ){.#if defined(H
4570: 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20 72 65  AVE_FCHOWN).  re
4580: 74 75 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29  turn osGeteuid()
4590: 20 3f 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28   ? 0 : osFchown(
45a0: 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6c  fd,uid,gid);.#el
45b0: 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  se.  return 0;.#
45c0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
45d0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
45e0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
45f0: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
4600: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
4610: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
4620: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4630: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
4640: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
4650: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
4660: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
4670: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
4680: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
4690: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
46a0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
46b0: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
46c0: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
46d0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
46e0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
46f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
4700: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
4710: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
4720: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
4730: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4740: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
4750: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
4760: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4770: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
4780: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
4790: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
47a0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
47b0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
47c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
47d0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
47e0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
47f0: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
4800: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
4810: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
4820: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
4830: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
4840: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
4850: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
4860: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
4870: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
4880: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
4890: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
48a0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
48b0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
48c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
48d0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
48e0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
48f0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4900: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
4910: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
4920: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
4930: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
4940: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
4950: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
4960: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
4970: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
4980: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
4990: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
49a0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
49b0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
49c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
49d0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
49e0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
49f0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
4a00: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4a10: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
4a20: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
4a30: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
4a40: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4a50: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
4a60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
4a70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
4a80: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
4a90: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
4aa0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
4ab0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
4ac0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
4ad0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
4ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4af0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4b00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4b10: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
4b20: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
4b30: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4b40: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
4b50: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
4b60: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
4b70: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
4b80: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
4b90: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
4ba0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
4bb0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
4bc0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
4bd0: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
4be0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
4bf0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4c00: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
4c10: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
4c20: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
4c30: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4c40: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
4c50: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4c60: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4c70: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4c80: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
4c90: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4ca0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4cb0: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
4cc0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
4cd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4ce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4cf0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4d00: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
4d10: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
4d20: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
4d30: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
4d40: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
4d50: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
4d60: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
4d70: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
4d80: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
4d90: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
4da0: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
4db0: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
4dc0: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
4dd0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
4de0: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
4df0: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
4e00: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
4e10: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
4e20: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
4e30: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
4e40: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
4e50: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
4e60: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
4e70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4e80: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
4e90: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4ea0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
4eb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
4ec0: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
4ed0: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
4ee0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
4ef0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
4f00: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
4f10: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
4f20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4f30: 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63  /*.** Do not acc
4f40: 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73  ept any file des
4f50: 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61  criptor less tha
4f60: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e  n this value, in
4f70: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a   order to avoid.
4f80: 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62  ** opening datab
4f90: 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66  ase file using f
4fa0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4fb0: 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c  that are commonl
4fc0: 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73  y used for .** s
4fd0: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
4fe0: 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72  utput, and error
4ff0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
5000: 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45  ITE_MINIMUM_FILE
5010: 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65  _DESCRIPTOR.# de
5020: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49  fine SQLITE_MINI
5030: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
5040: 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TOR 3.#endif../*
5050: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28  .** Invoke open(
5060: 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70  ).  Do so multip
5070: 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20  le times, until 
5080: 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65  it either succee
5090: 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66  ds or.** fails f
50a0: 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f  or some reason o
50b0: 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e  ther than EINTR.
50c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
50d0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
50e0: 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73   "m" is 0 then s
50f0: 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66  et it to the def
5100: 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69  ault for.** SQLi
5110: 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  te.  The default
5120: 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55   is SQLITE_DEFAU
5130: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
5140: 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ONS (normally.**
5150: 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69   0644) as modifi
5160: 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d  ed by the system
5170: 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73   umask.  If m is
5180: 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20   not 0, then.** 
5190: 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72  make the file cr
51a0: 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65  eation mode be e
51b0: 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e  xactly m ignorin
51c0: 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a  g the umask..**.
51d0: 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74  ** The m paramet
51e0: 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a  er will be non-z
51f0: 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72  ero only when cr
5200: 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f  eating -wal, -jo
5210: 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73  urnal,.** and -s
5220: 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61  hm files.  We wa
5230: 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74  nt those files t
5240: 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a  o have *exactly*
5250: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72   the same.** per
5260: 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69  missions as thei
5270: 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  r original datab
5280: 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74  ase, unadulterat
5290: 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
52a0: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c  .** In that way,
52b0: 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
52c0: 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77  ile is -rw-rw-rw
52d0: 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61   or -rw-rw-r-, a
52e0: 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74  nd a.** transact
52f0: 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20  ion crashes and 
5300: 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f  leaves behind ho
5310: 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
5320: 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20   any.** process 
5330: 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20  that is able to 
5340: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
5350: 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20  abase will also 
5360: 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65  be able to.** re
5370: 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f  cover the hot jo
5380: 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  urnals..*/.stati
5390: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65  c int robust_ope
53a0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
53b0: 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d   int f, mode_t m
53c0: 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d  ){.  int fd;.  m
53d0: 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d  ode_t m2 = m ? m
53e0: 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   : SQLITE_DEFAUL
53f0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
5400: 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  NS;.  while(1){.
5410: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c  #if defined(O_CL
5420: 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20  OEXEC).    fd = 
5430: 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f  osOpen(z,f|O_CLO
5440: 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a  EXEC,m2);.#else.
5450: 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28      fd = osOpen(
5460: 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a  z,f,m2);.#endif.
5470: 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
5480: 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d        if( errno=
5490: 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75  =EINTR ) continu
54a0: 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
54b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64      }.    if( fd
54c0: 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  >=SQLITE_MINIMUM
54d0: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
54e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73   ) break;.    os
54f0: 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73  Close(fd);.    s
5500: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
5510: 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20  E_WARNING, .    
5520: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74              "att
5530: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25  empt to open \"%
5540: 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63  s\" as file desc
5550: 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66  riptor %d", z, f
5560: 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b  d);.    fd = -1;
5570: 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28  .    if( osOpen(
5580: 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20  "/dev/null", f, 
5590: 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m)<0 ) break;.  
55a0: 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b  }.  if( fd>=0 ){
55b0: 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b  .    if( m!=0 ){
55c0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
55d0: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20  at statbuf;.    
55e0: 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64    if( osFstat(fd
55f0: 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a  , &statbuf)==0 .
5600: 20 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75         && statbu
5610: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20  f.st_size==0.   
5620: 20 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e      && (statbuf.
5630: 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d  st_mode&0777)!=m
5640: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
5650: 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20     osFchmod(fd, 
5660: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
5670: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44  }.#if defined(FD
5680: 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64  _CLOEXEC) && (!d
5690: 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43  efined(O_CLOEXEC
56a0: 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d  ) || O_CLOEXEC==
56b0: 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  0).    osFcntl(f
56c0: 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
56d0: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
56e0: 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
56f0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
5700: 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a  return fd;.}../*
5710: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
5720: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
5730: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
5740: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
5750: 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
5760: 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
5770: 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49  rotect the unixI
5780: 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20  nodeInfo and.** 
5790: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
57a0: 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68  jects used by th
57b0: 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
57c0: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
57d0: 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
57e0: 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
57f0: 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78  ** Function unix
5800: 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
5810: 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
5820: 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
5830: 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c  mutex .** is hel
5840: 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
5850: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
5860: 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
5870: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
5880: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
5890: 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69  e.g..**.**   uni
58a0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  xEnterMutex().**
58b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
58c0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
58d0: 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65  **   unixEnterLe
58e0: 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ave().*/.static 
58f0: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
5900: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
5910: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
5920: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
5930: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
5940: 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d  STATIC_VFS1));.}
5950: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
5960: 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  xLeaveMutex(void
5970: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
5980: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
5990: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
59a0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56  E_MUTEX_STATIC_V
59b0: 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  FS1));.}.#ifdef 
59c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
59d0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65  tic int unixMute
59e0: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
59f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
5a00: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
5a10: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
5a20: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
5a30: 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  VFS1));.}.#endif
5a40: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
5a50: 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 0a 2f  _HAVE_OS_TRACE./
5a60: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
5a70: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
5a80: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
5a90: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
5aa0: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
5ab0: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
5ac0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
5ad0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
5ae0: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
5af0: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
5b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5b10: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
5b20: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
5b30: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
5b40: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
5b50: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
5b60: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
5b70: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
5b80: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
5b90: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
5ba0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
5bb0: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
5bc0: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
5bd0: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
5be0: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
5bf0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
5c00: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
5c10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
5c20: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
5c30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5c40: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
5c50: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
5c60: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
5c70: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
5c80: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
5c90: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
5ca0: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
5cb0: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
5cc0: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
5cd0: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
5ce0: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
5cf0: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
5d00: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
5d10: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
5d20: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
5d30: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
5d40: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
5d50: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
5d60: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
5d70: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
5d80: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
5d90: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
5da0: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
5db0: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
5dc0: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
5dd0: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
5de0: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
5df0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
5e00: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
5e10: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
5e20: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
5e30: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
5e40: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
5e50: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
5e60: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
5e70: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
5e80: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
5e90: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
5ea0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
5eb0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
5ec0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
5ed0: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
5ee0: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
5ef0: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5f00: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
5f10: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
5f20: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
5f30: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
5f40: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
5f50: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
5f60: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
5f70: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
5f80: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
5f90: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
5fa0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
5fb0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
5fc0: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
5fd0: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
5fe0: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
5ff0: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
6000: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
6010: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
6020: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
6030: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
6040: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
6050: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
6060: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
6070: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
6080: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
6090: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
60a0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
60b0: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
60c0: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
60d0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
60e0: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
60f0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
6100: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6110: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
6120: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
6130: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
6140: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
6150: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
6160: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
6170: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
6180: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
6190: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
61a0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
61b0: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
61c0: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
61d0: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
61e0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
61f0: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
6200: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
6210: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
6220: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
6230: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
6240: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
6250: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
6260: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
6270: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
6280: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
6290: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
62a0: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
62b0: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2a   due to EINTR.**
62c0: 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20 74 6f  .** All calls to
62d0: 20 66 74 72 75 6e 63 61 74 65 28 29 20 77 69 74   ftruncate() wit
62e0: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20 73 68  hin this file sh
62f0: 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74 68 72  ould be made thr
6300: 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77 72 61  ough.** this wra
6310: 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20 41 6e  pper.  On the An
6320: 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d 2c 20  droid platform, 
6330: 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 6c 6f  bypassing the lo
6340: 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75  gic below.** cou
6350: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63 6f 72  ld lead to a cor
6360: 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 0a 2a  rupt database..*
6370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
6380: 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e  ust_ftruncate(in
6390: 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  t h, sqlite3_int
63a0: 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63  64 sz){.  int rc
63b0: 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f  ;.#ifdef __ANDRO
63c0: 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64  ID__.  /* On And
63d0: 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74 65 28  roid, ftruncate(
63e0: 29 20 61 6c 77 61 79 73 20 75 73 65 73 20 33 32  ) always uses 32
63f0: 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20 65 76  -bit offsets, ev
6400: 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46 49 4c  en if .  ** _FIL
6410: 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34  E_OFFSET_BITS=64
6420: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69   is defined. Thi
6430: 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20 75 6e  s means it is un
6440: 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70 74 20  safe to attempt 
6450: 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65  to.  ** truncate
6460: 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79 20 73   a file to any s
6470: 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ize larger than 
6480: 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79 20 69  2GiB. Silently i
6490: 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 73  gnore any.  ** s
64a0: 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20 20 2a  uch attempts.  *
64b0: 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71 6c 69  /.  if( sz>(sqli
64c0: 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46 46 46  te3_int64)0x7FFF
64d0: 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63 20 3d  FFFF ){.    rc =
64e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
64f0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b  lse.#endif.  do{
6500: 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74   rc = osFtruncat
6510: 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28  e(h,sz); }while(
6520: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
6530: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
6540: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
6550: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e  his routine tran
6560: 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  slates a standar
6570: 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f  d POSIX errno co
6580: 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e  de into somethin
6590: 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74  g.** useful to t
65a0: 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68  he clients of th
65b0: 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69  e sqlite3 functi
65c0: 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ons.  Specifical
65d0: 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74  ly, it is.** int
65e0: 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61  ended to transla
65f0: 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  te a variety of 
6600: 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f  "try again" erro
6610: 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42  rs into SQLITE_B
6620: 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72  USY.** and a var
6630: 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20  iety of "please 
6640: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
6650: 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65  escriptor NOW" e
6660: 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53  rrors into .** S
6670: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a  QLITE_IOERR.** .
6680: 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67  ** Errors during
6690: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
66a0: 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c  of locks, or fil
66b0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
66c0: 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73   for locks,.** s
66d0: 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f  hould handle ENO
66e0: 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f  LCK, ENOTSUP, EO
66f0: 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74  PNOTSUPP separat
6700: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
6710: 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72  nt sqliteErrorFr
6720: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  omPosixError(int
6730: 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74   posixError, int
6740: 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a   sqliteIOErr) {.
6750: 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 74    assert( (sqlit
6760: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6770: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20  _IOERR_LOCK) || 
6780: 0a 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  .          (sqli
6790: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
67a0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20  E_IOERR_UNLOCK) 
67b0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73  || .          (s
67c0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
67d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
67e0: 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  K) ||.          
67f0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6800: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
6810: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20  CKRESERVEDLOCK) 
6820: 29 3b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73  );.  switch (pos
6830: 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61 73  ixError) {.  cas
6840: 65 20 45 41 43 43 45 53 3a 20 0a 20 20 63 61 73  e EACCES: .  cas
6850: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
6860: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
6870: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
6880: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
6890: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
68a0: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
68b0: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
68c0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
68d0: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
68e0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
68f0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
6900: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
6910: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
6920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
6930: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
6940: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
6950: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
6960: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
6970: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
6980: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
6990: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
69a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69e0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
69f0: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
6a00: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
6a10: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
6a20: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
6a30: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
6a40: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
6a50: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
6a60: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
6a70: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
6a80: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
6a90: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
6aa0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
6ab0: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
6ac0: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
6ad0: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
6ae0: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
6af0: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
6b00: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
6b10: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
6b20: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
6b30: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
6b40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
6b50: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
6b60: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
6b70: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
6b80: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
6b90: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
6ba0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
6bb0: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
6bc0: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
6bd0: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
6be0: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
6bf0: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
6c00: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
6c10: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
6c20: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
6c30: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
6c40: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
6c50: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
6c60: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
6c70: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
6c80: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
6c90: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
6ca0: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
6cb0: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
6cc0: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
6cd0: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
6ce0: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
6cf0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
6d00: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
6d10: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
6d20: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
6d30: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
6d40: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
6d50: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
6d80: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
6d90: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
6da0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
6db0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
6dc0: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
6dd0: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
6de0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
6df0: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
6e00: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
6e10: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
6e20: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
6e30: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
6e40: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
6e50: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
6e60: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
6e70: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
6e80: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
6e90: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6ea0: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
6eb0: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
6ec0: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
6ed0: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
6ee0: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
6ef0: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
6f00: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
6f10: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
6f20: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
6f30: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
6f40: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
6f50: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
6f60: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
6f70: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
6f80: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
6f90: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
6fa0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
6fb0: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
6fc0: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
6fd0: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
6fe0: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
6ff0: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
7000: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
7010: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
7020: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
7030: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
7040: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
7050: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
7060: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
7070: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
7080: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
7090: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
70a0: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
70b0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
70c0: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
70d0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
70e0: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
70f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
7100: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
7110: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
7120: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
7130: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
7140: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
7150: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
7160: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
7170: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
7180: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
7190: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
71a0: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
71b0: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
71c0: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
71d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
71e0: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
71f0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
7200: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
7210: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
7220: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
7230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
7240: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
7250: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
7260: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
7270: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
7280: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
7290: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
72a0: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
72b0: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
72c0: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
72d0: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
72e0: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
72f0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
7300: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
7310: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
7320: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
7330: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
7340: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
7350: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
7360: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
7370: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
7380: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
7390: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
73a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
73b0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
73c0: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
73d0: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
73e0: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
73f0: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
7400: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
7410: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7420: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
7430: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
7440: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
7450: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
7460: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
7470: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
7480: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
7490: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
74a0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
74d0: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
74e0: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
74f0: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
7500: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
7510: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
7520: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
7530: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
7540: 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
7550: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
7560: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7570: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7580: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7590: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
75a0: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
75b0: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
75c0: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
75d0: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
75e0: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
75f0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
7600: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
7610: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
7620: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
7630: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
7640: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
7650: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
7660: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
7670: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
7680: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
7690: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
76a0: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
76b0: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
76c0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
76d0: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
76e0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
76f0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
7700: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
7710: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
7720: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
7730: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
7740: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
7750: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
7760: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
7770: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
7780: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
7790: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
77a0: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
77b0: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
77c0: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
77d0: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
77e0: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
77f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7800: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
7810: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
7820: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
7830: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
7840: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
7850: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
7860: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
7870: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
7880: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
7890: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
78a0: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
78b0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
78c0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
78d0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
78e0: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
78f0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
7900: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
7910: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
7920: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
7930: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
7940: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
7950: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
7960: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
7970: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
7980: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
7990: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
79a0: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
79b0: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
79c0: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
79d0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
79e0: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
79f0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
7a00: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
7a10: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
7a20: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
7a30: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
7a40: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
7a50: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
7a60: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
7a70: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
7a80: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
7a90: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
7aa0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
7ab0: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
7ac0: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
7ad0: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
7ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7af0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
7b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
7b40: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
7b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b90: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
7ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
7bb0: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
7bc0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
7bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7be0: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
7bf0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
7c00: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
7c10: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
7c20: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
7c30: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
7c40: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
7c50: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
7c60: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
7c70: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
7c80: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
7c90: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
7ca0: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
7cb0: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
7cc0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
7cd0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
7ce0: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
7cf0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
7d00: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
7d10: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
7d20: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
7d30: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
7d40: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
7d50: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
7d60: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
7d70: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
7d80: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
7d90: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
7da0: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
7db0: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
7dc0: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
7dd0: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
7de0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
7df0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
7e00: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
7e10: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
7e20: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
7e30: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
7e40: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
7e50: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
7e60: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
7e70: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
7e80: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
7e90: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
7ea0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
7eb0: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
7ec0: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
7ed0: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
7ee0: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
7ef0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
7f00: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
7f10: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
7f20: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
7f30: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
7f40: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
7f50: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
7f60: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
7f70: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
7f80: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
7f90: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
7fa0: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
7fb0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
7fc0: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
7fd0: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
7fe0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
7ff0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
8000: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
8010: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
8020: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
8030: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
8040: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
8050: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
8060: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
8070: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
8080: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
8090: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
80a0: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
80b0: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
80c0: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
80d0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
80e0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
80f0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
8100: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
8110: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
8120: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
8130: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
8140: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
8150: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
8160: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
8170: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
8180: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
8190: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
81a0: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
81b0: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
81c0: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
81d0: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
81e0: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
81f0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
8200: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
8210: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
8220: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
8230: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
8240: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
8250: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
8260: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
8270: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
8280: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
8290: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
82a0: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
82b0: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
82c0: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
82d0: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
82e0: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
82f0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
8300: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
8310: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
8320: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
8330: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
8340: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
8350: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
8360: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
8370: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
8380: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
8390: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
83a0: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
83b0: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
83c0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
83d0: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
83e0: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
83f0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
8400: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
8410: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
8420: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
8430: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
8440: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
8450: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
8460: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
8470: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
8480: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
8490: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
84a0: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
84b0: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
84c0: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
84d0: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
84e0: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
84f0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
8500: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
8510: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
8520: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
8530: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
8540: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
8550: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
8560: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
8570: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
8580: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
8590: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
85a0: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
85b0: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
85c0: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
85d0: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
85e0: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
85f0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
8600: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
8610: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
8620: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
8630: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
8640: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
8650: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
8660: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
8670: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
8680: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
8690: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
86a0: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
86b0: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
86c0: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
86d0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
86e0: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
86f0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
8700: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
8710: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
8720: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
8730: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
8740: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
8750: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
8760: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
8770: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
8780: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
8790: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
87a0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
87b0: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
87c0: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
87d0: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
87e0: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
87f0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
8800: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
8810: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
8820: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
8830: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
8840: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
8850: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
8860: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
8870: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
8880: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
8890: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
88a0: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
88b0: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
88c0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
88d0: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
88e0: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
88f0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
8900: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
8910: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
8920: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
8930: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
8940: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
8950: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
8960: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
8970: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
8980: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
8990: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
89a0: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
89b0: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
89c0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
89d0: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
89e0: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
89f0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
8a00: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
8a10: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
8a20: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
8a30: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
8a40: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
8a50: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
8a60: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
8a70: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
8a80: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
8a90: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
8aa0: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
8ab0: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
8ac0: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
8ad0: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
8ae0: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
8af0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
8b00: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
8b10: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
8b20: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
8b30: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
8b40: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
8b50: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
8b60: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
8b70: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
8b80: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
8b90: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
8ba0: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
8bb0: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
8bc0: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
8bd0: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
8be0: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
8bf0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
8c00: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
8c10: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
8c20: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
8c30: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
8c40: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
8c50: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
8c60: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
8c70: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
8c80: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
8c90: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
8ca0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
8cb0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
8cc0: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
8cd0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
8ce0: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
8cf0: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
8d00: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
8d10: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
8d20: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
8d30: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
8d40: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
8d50: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
8d60: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
8d70: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
8d80: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
8d90: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
8da0: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
8db0: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
8dc0: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
8dd0: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
8de0: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
8df0: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
8e00: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
8e10: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
8e20: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
8e30: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
8e40: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
8e50: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
8e60: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
8e70: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
8e80: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
8e90: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8ea0: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
8eb0: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
8ec0: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
8ed0: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
8ee0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
8ef0: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
8f00: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
8f10: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
8f20: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
8f30: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
8f40: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
8f50: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
8f60: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
8f70: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
8f80: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
8f90: 20 2f 2a 20 57 65 20 61 72 65 20 74 6f 6c 64 20   /* We are told 
8fa0: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
8fb0: 6e 73 20 6f 66 20 41 6e 64 72 6f 69 64 20 63 6f  ns of Android co
8fc0: 6e 74 61 69 6e 20 61 20 62 75 67 20 74 68 61 74  ntain a bug that
8fd0: 0a 20 20 2a 2a 20 73 69 7a 65 73 20 69 6e 6f 5f  .  ** sizes ino_
8fe0: 74 20 61 74 20 6f 6e 6c 79 20 33 32 2d 62 69 74  t at only 32-bit
8ff0: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 36 34 2d  s instead of 64-
9000: 62 69 74 73 2e 20 28 53 65 65 0a 20 20 2a 2a 20  bits. (See.  ** 
9010: 68 74 74 70 73 3a 2f 2f 61 6e 64 72 6f 69 64 2d  https://android-
9020: 72 65 76 69 65 77 2e 67 6f 6f 67 6c 65 73 6f 75  review.googlesou
9030: 72 63 65 2e 63 6f 6d 2f 23 2f 63 2f 31 31 35 33  rce.com/#/c/1153
9040: 35 31 2f 33 2f 64 69 73 74 2f 73 71 6c 69 74 65  51/3/dist/sqlite
9050: 33 2e 63 29 0a 20 20 2a 2a 20 54 6f 20 77 6f 72  3.c).  ** To wor
9060: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 61  k around this, a
9070: 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 20 36  lways allocate 6
9080: 34 2d 62 69 74 73 20 66 6f 72 20 74 68 65 20 69  4-bits for the i
9090: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 0a 20  node number.  . 
90a0: 20 2a 2a 20 4f 6e 20 73 6d 61 6c 6c 20 6d 61 63   ** On small mac
90b0: 68 69 6e 65 73 20 74 68 61 74 20 6f 6e 6c 79 20  hines that only 
90c0: 68 61 76 65 20 33 32 2d 62 69 74 20 69 6e 6f 64  have 32-bit inod
90d0: 65 73 2c 20 74 68 69 73 20 77 61 73 74 65 73 20  es, this wastes 
90e0: 34 20 62 79 74 65 73 2c 0a 20 20 2a 2a 20 62 75  4 bytes,.  ** bu
90f0: 74 20 74 68 61 74 20 73 68 6f 75 6c 64 20 6e 6f  t that should no
9100: 74 20 62 65 20 61 20 62 69 67 20 64 65 61 6c 2e  t be a big deal.
9110: 20 2a 2f 0a 20 20 2f 2a 20 57 41 53 3a 20 20 69   */.  /* WAS:  i
9120: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 2a 2f 0a 20  no_t ino;   */. 
9130: 20 75 36 34 20 69 6e 6f 3b 20 20 20 20 20 20 20   u64 ino;       
9140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9150: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  node number */.#
9160: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
9170: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
9180: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
9190: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
91a0: 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65  ted for each ope
91b0: 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c  n.** inode.  Or,
91c0: 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73   on LinuxThreads
91d0: 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f  , there is one o
91e0: 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
91f0: 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69  es for.** each i
9200: 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65  node opened by e
9210: 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  ach thread..**.*
9220: 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65  * A single inode
9230: 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
9240: 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
9250: 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69  ors, so each uni
9260: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
9270: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
9280: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
9290: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
92a0: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  ect and this.** 
92b0: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63  object keeps a c
92c0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
92d0: 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70  er of unixFile p
92e0: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
92f0: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f  /.struct unixIno
9300: 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  deInfo {.  struc
9310: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
9320: 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  eId;       /* Th
9330: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
9340: 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20    int nShared;  
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
9370: 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64  HARED locks held
9380: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9390: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
93a0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
93b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
93c0: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
93d0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
93e0: 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b  ar bProcessLock;
93f0: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75       /* An exclu
9400: 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63  sive process loc
9410: 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69  k is held */.  i
9420: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  * Number of poin
9450: 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72  ters to this str
9460: 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78  ucture */.  unix
9470: 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
9480: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  e;          /* S
9490: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
94a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
94b0: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  s inode */.  int
94c0: 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   nLock;         
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94e0: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
94f0: 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  nding file locks
9500: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
9510: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
9520: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
9530: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
9540: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75   to close */.  u
9550: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e  nixInodeInfo *pN
9560: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ext;           /
9570: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e  * List of all un
9580: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
9590: 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  cts */.  unixIno
95a0: 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20  deInfo *pPrev;  
95b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e           /*    .
95c0: 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65  ... doubly linke
95d0: 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  d */.#if SQLITE_
95e0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
95f0: 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20  TYLE.  unsigned 
9600: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
9610: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
9620: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
9630: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
9640: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
9650: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
9680: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
9690: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
96a0: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
96b0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
96c0: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
96d0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
96e0: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
96f0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
9700: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  cts..*/.static u
9710: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
9720: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
9730: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9740: 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72  tion - unixLogEr
9750: 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69 73 20  rorAtLine(), is 
9760: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
9770: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
9780: 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29  * unixLogError()
9790: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e  ..**.** It is in
97a0: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
97b0: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
97c0: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e  n OS function an
97d0: 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e  d errno has been
97e0: 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73  .** set. It logs
97f0: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67   a message using
9800: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63   sqlite3_log() c
9810: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
9820: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a  rrent value of.*
9830: 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20  * errno and, if 
9840: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
9850: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
9860: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72  ivalent from str
9870: 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74  error() or.** st
9880: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a  rerror_r()..**.*
9890: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
98a0: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
98b0: 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  he macro should 
98c0: 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  be the error cod
98d0: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
98e0: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  e returned to SQ
98f0: 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54  Lite (e.g. SQLIT
9900: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
9910: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
9920: 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  . .** The two su
9930: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
9940: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
9950: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
9960: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
9970: 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75   failed (e.g. "u
9980: 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20  nlink", "open") 
9990: 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74  and the associat
99a0: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
99b0: 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a  ath,.** if any..
99c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c  */.#define unixL
99d0: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20  ogError(a,b,c)  
99e0: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
99f0: 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49  tLine(a,b,c,__LI
9a00: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
9a10: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9a20: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
9a30: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
9a40: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
9a50: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
9a60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
9a70: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
9a80: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66   /* Name of OS f
9a90: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69  unction that fai
9aa0: 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  led */.  const c
9ab0: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
9ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
9ad0: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
9ae0: 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20   with error */. 
9af0: 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20   int iLine      
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20   /* Source line 
9b20: 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72  number where err
9b30: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  or occurred */.)
9b40: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20  {.  char *zErr; 
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66      /* Message f
9b70: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
9b80: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a  r equivalent */.
9b90: 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65    int iErrno = e
9ba0: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
9bb0: 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61    /* Saved sysca
9bc0: 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20  ll error number 
9bd0: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
9be0: 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64   is not a thread
9bf0: 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49  safe build (SQLI
9c00: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30  TE_THREADSAFE==0
9c10: 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a  ), then use.  **
9c20: 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20   the strerror() 
9c30: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  function to obta
9c40: 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  in the human-rea
9c50: 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  dable error mess
9c60: 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c  age.  ** equival
9c70: 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74  ent to errno. Ot
9c80: 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72  herwise, use str
9c90: 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20  error_r()..  */ 
9ca0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
9cb0: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
9cc0: 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f  d(HAVE_STRERROR_
9cd0: 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38  R).  char aErr[8
9ce0: 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72  0];.  memset(aEr
9cf0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72  r, 0, sizeof(aEr
9d00: 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45  r));.  zErr = aE
9d10: 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52  rr;..  /* If STR
9d20: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28  ERROR_R_CHAR_P (
9d30: 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20  set by autoconf 
9d40: 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53  scripts) or __US
9d50: 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64  E_GNU is defined
9d60: 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68  ,.  ** assume th
9d70: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
9d80: 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20 76  ovides the GNU v
9d90: 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72  ersion of strerr
9da0: 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a 2a  or_r() that.  **
9db0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
9dc0: 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
9dd0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72  ontaining the er
9de0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61  ror message. Tha
9df0: 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20  t pointer .  ** 
9e00: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72  may point to aEr
9e10: 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70  r[], or it may p
9e20: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61  oint to some sta
9e30: 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65  tic storage some
9e40: 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68  where. .  ** Oth
9e50: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74  erwise, assume t
9e60: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
9e70: 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49  rovides the POSI
9e80: 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  X version of .  
9e90: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c  ** strerror_r(),
9ea0: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72   which always wr
9eb0: 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ites an error me
9ec0: 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b  ssage into aErr[
9ed0: 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  ]..  **.  ** If 
9ee0: 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65  the code incorre
9ef0: 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61  ctly assumes tha
9f00: 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49  t it is the POSI
9f10: 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69  X version that i
9f20: 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
9f30: 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  , the error mess
9f40: 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62  age will often b
9f50: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
9f60: 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75  g. Not a.  ** hu
9f70: 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f  ge problem. Inco
9f80: 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69  rrectly concludi
9f90: 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20  ng that the GNU 
9fa0: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
9fb0: 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64  able .  ** could
9fc0: 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61   lead to a segfa
9fd0: 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f  ult though..  */
9fe0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52  .#if defined(STR
9ff0: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20  ERROR_R_CHAR_P) 
a000: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45  || defined(__USE
a010: 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a  _GNU).  zErr = .
a020: 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72  # endif.  strerr
a030: 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72  or_r(iErrno, aEr
a040: 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d  r, sizeof(aErr)-
a050: 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54  1);..#elif SQLIT
a060: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f  E_THREADSAFE.  /
a070: 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65  * This is a thre
a080: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75  adsafe build, bu
a090: 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69  t strerror_r() i
a0a0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
a0b0: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b   */.  zErr = "";
a0c0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d  .#else.  /* Non-
a0d0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
a0e0: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29  , use strerror()
a0f0: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74  . */.  zErr = st
a100: 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a  rerror(iErrno);.
a110: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a 50  #endif..  if( zP
a120: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
a130: 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c   "";.  sqlite3_l
a140: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
a150: 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a    "os_unix.c:%d:
a160: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
a170: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
a180: 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20   iErrno, zFunc, 
a190: 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b  zPath, zErr.  );
a1a0: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
a1b0: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  de;.}../*.** Clo
a1c0: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
a1d0: 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ptor..**.** We a
a1e0: 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65  ssume that close
a1f0: 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  () almost always
a200: 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74   works, since it
a210: 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a   is only in a.**
a220: 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69   very sick appli
a230: 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76  cation or on a v
a240: 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72  ery sick platfor
a250: 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  m that it might 
a260: 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64  fail..** If it d
a270: 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79  oes fail, simply
a280: 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64   leak the file d
a290: 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64  escriptor, but d
a2a0: 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72  o log the.** err
a2b0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  or..**.** Note t
a2c0: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
a2d0: 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73  fe to retry clos
a2e0: 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20  e() after EINTR 
a2f0: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c  since the.** fil
a300: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67  e descriptor mig
a310: 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ht have already 
a320: 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61  been reused by a
a330: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a  nother thread..*
a340: 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76  * So we don't ev
a350: 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65  en try to recove
a360: 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e  r from an EINTR.
a370: 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65    Just log the e
a380: 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65  rror.** and move
a390: 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   on..*/.static v
a3a0: 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  oid robust_close
a3b0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
a3c0: 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e  , int h, int lin
a3d0: 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c  eno){.  if( osCl
a3e0: 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e  ose(h) ){.    un
a3f0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
a400: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
a410: 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20  OSE, "close",.  
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69       pFile ? pFi
a440: 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c  le->zPath : 0, l
a450: 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ineno);.  }.}../
a460: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46 69  *.** Set the pFi
a470: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20  le->lastErrno.  
a480: 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62  Do this in a sub
a490: 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74 20  routine as that 
a4a0: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f  provides.** a co
a4b0: 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
a4c0: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
a4d0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
a4e0: 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  id storeLastErrn
a4f0: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
a500: 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20  e, int error){. 
a510: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a520: 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  o = error;.}../*
a530: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69  .** Close all fi
a540: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61  le descriptors a
a550: 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65  ccumuated in the
a560: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e   unixInodeInfo->
a570: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
a580: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c   .static void cl
a590: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e  osePendingFds(un
a5a0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
a5b0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
a5c0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
a5d0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
a5e0: 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e  nusedFd *p;.  Un
a5f0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
a600: 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64  t;.  for(p=pInod
a610: 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70  e->pUnused; p; p
a620: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
a630: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
a640: 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
a650: 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f  pFile, p->fd, __
a660: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c  LINE__);.    sql
a670: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
a680: 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  }.  pInode->pUnu
a690: 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
a6a0: 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78  * Release a unix
a6b0: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
a6c0: 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ure previously a
a6d0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64  llocated by find
a6e0: 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a  InodeInfo()..**.
a6f0: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
a700: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
a710: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
a720: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
a730: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
a740: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
a750: 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
a760: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f   void releaseIno
a770: 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20  deInfo(unixFile 
a780: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
a790: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
a7a0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
a7b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
a7c0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
a7d0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f   if( ALWAYS(pIno
a7e0: 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  de) ){.    pInod
a7f0: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  e->nRef--;.    i
a800: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d  f( pInode->nRef=
a810: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
a820: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  rt( pInode->pShm
a830: 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Node==0 );.     
a840: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
a850: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (pFile);.      i
a860: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  f( pInode->pPrev
a870: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
a880: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  rt( pInode->pPre
a890: 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65  v->pNext==pInode
a8a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
a8b0: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
a8c0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
a8d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a8e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
a8f0: 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65  nodeList==pInode
a900: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64   );.        inod
a910: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  eList = pInode->
a920: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
a930: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
a940: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
a950: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
a960: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d  ->pNext->pPrev==
a970: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
a980: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d    pInode->pNext-
a990: 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d  >pPrev = pInode-
a9a0: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a  >pPrev;.      }.
a9b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
a9c0: 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  ee(pInode);.    
a9d0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
a9e0: 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  iven a file desc
a9f0: 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74  riptor, locate t
aa00: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
aa10: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
aa20: 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66  describes that f
aa30: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
aa40: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
aa50: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  e if necessary. 
aa60: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
aa70: 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e  alue might be un
aa80: 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61  initialized if a
aa90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
aaa0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
aab0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
aac0: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
aad0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
aae0: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
aaf0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
ab00: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
ab10: 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70  Return an approp
ab20: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
ab30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ab40: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20  findInodeInfo(. 
ab50: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
ab60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ab70: 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74  /* Unix file wit
ab80: 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64  h file desc used
ab90: 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   in the key */. 
aba0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
abb0: 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20  *ppInode        
abc0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  /* Return the un
abd0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
abe0: 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ct here */.){.  
abf0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac10: 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65  * System call re
ac20: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
ac30: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac50: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
ac60: 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a  ptor for pFile *
ac70: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  /.  struct unixF
ac80: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
ac90: 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79     /* Lookup key
aca0: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f   for the unixIno
acb0: 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75  deInfo */.  stru
acc0: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
acd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
ace0: 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66  w-level file inf
acf0: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  ormation */.  un
ad00: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
ad10: 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ode = 0;     /* 
ad20: 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e  Candidate unixIn
ad30: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  odeInfo object *
ad40: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  /..  assert( uni
ad50: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
ad60: 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65  .  /* Get low-le
ad70: 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  vel information 
ad80: 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74  about the file t
ad90: 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20  hat we can used 
ada0: 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61  to.  ** create a
adb0: 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72   unique name for
adc0: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
add0: 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b    fd = pFile->h;
ade0: 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
adf0: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
ae00: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
ae10: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
ae20: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
ae30: 23 69 66 20 64 65 66 69 6e 65 64 28 45 4f 56 45  #if defined(EOVE
ae40: 52 46 4c 4f 57 29 20 26 26 20 64 65 66 69 6e 65  RFLOW) && define
ae50: 64 28 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  d(SQLITE_DISABLE
ae60: 5f 4c 46 53 29 0a 20 20 20 20 69 66 28 20 70 46  _LFS).    if( pF
ae70: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
ae80: 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75  EOVERFLOW ) retu
ae90: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b  rn SQLITE_NOLFS;
aea0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
aeb0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
aec0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41  .  }..#ifdef __A
aed0: 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f  PPLE__.  /* On O
aee0: 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20  S X on an msdos 
aef0: 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20  filesystem, the 
af00: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20  inode number is 
af10: 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e  reported.  ** in
af20: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65  correctly for ze
af30: 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20  ro-size files.  
af40: 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30  See ticket #3260
af50: 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20  .  To work.  ** 
af60: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
af70: 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72  lem (we consider
af80: 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20   it a bug in OS 
af90: 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20  X, not SQLite). 
afa0: 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e   ** we always in
afb0: 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20  crease the file 
afc0: 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69  size to 1 by wri
afd0: 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79  ting a single by
afe0: 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f  te.  ** prior to
aff0: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69   accessing the i
b000: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  node number.  Th
b010: 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74  e one byte writt
b020: 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53  en is.  ** an AS
b030: 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65  CII 'S' characte
b040: 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70  r which also hap
b050: 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66  pens to be the f
b060: 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69  irst byte.  ** i
b070: 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
b080: 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74  every SQLite dat
b090: 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20  abase.  In this 
b0a0: 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20  way, if there.  
b0b0: 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e  ** is a race con
b0c0: 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74  dition such that
b0d0: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
b0e0: 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75  has already popu
b0f0: 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66  lated.  ** the f
b100: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
b110: 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61   database, no da
b120: 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20  mage is done..  
b130: 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66  */.  if( statbuf
b140: 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28  .st_size==0 && (
b150: 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26  pFile->fsFlags &
b160: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
b170: 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a  IS_MSDOS)!=0 ){.
b180: 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57      do{ rc = osW
b190: 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29  rite(fd, "S", 1)
b1a0: 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
b1b0: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
b1c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20  ;.    if( rc!=1 
b1d0: 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
b1e0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
b1f0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  rrno);.      ret
b200: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
b210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
b220: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
b230: 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
b240: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  rc!=0 ){.      s
b250: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
b260: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
b270: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b280: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
b290: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73  }.#endif..  mems
b2a0: 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73  et(&fileId, 0, s
b2b0: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
b2c0: 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73    fileId.dev = s
b2d0: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23  tatbuf.st_dev;.#
b2e0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
b2f0: 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69  fileId.pId = pFi
b300: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
b310: 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 28 75   fileId.ino = (u
b320: 36 34 29 73 74 61 74 62 75 66 2e 73 74 5f 69 6e  64)statbuf.st_in
b330: 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f  o;.#endif.  pIno
b340: 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
b350: 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
b360: 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49  && memcmp(&fileI
b370: 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  d, &pInode->file
b380: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
b390: 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  d)) ){.    pInod
b3a0: 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
b3b0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  t;.  }.  if( pIn
b3c0: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  ode==0 ){.    pI
b3d0: 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  node = sqlite3_m
b3e0: 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
b3f0: 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20  *pInode) );.    
b400: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
b410: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
b420: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
b430: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
b440: 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a  t(pInode, 0, siz
b450: 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20  eof(*pInode));. 
b460: 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64     memcpy(&pInod
b470: 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65  e->fileId, &file
b480: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
b490: 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d));.    pInode-
b4a0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
b4b0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69  Inode->pNext = i
b4c0: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49  nodeList;.    pI
b4d0: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b  node->pPrev = 0;
b4e0: 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69  .    if( inodeLi
b4f0: 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e  st ) inodeList->
b500: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a  pPrev = pInode;.
b510: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
b520: 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  pInode;.  }else{
b530: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
b540: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e  f++;.  }.  *ppIn
b550: 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ode = pInode;.  
b560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b580: 6e 20 54 52 55 45 20 69 66 20 70 46 69 6c 65 20  n TRUE if pFile 
b590: 68 61 73 20 62 65 65 6e 20 72 65 6e 61 6d 65 64  has been renamed
b5a0: 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20 73 69 6e   or unlinked sin
b5b0: 63 65 20 69 74 20 77 61 73 20 66 69 72 73 74 20  ce it was first 
b5c0: 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  opened..*/.stati
b5d0: 63 20 69 6e 74 20 66 69 6c 65 48 61 73 4d 6f 76  c int fileHasMov
b5e0: 65 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ed(unixFile *pFi
b5f0: 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  le){.#if OS_VXWO
b600: 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 70 46 69  RKS.  return pFi
b610: 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26  le->pInode!=0 &&
b620: 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d 70 46 69   pFile->pId!=pFi
b630: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  le->pInode->file
b640: 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  Id.pId;.#else.  
b650: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
b660: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
b670: 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a 20 20  >pInode!=0 &&.  
b680: 20 20 20 20 28 6f 73 53 74 61 74 28 70 46 69 6c      (osStat(pFil
b690: 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75 66 29 21  e->zPath, &buf)!
b6a0: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
b6b0: 28 75 36 34 29 62 75 66 2e 73 74 5f 69 6e 6f 21  (u64)buf.st_ino!
b6c0: 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  =pFile->pInode->
b6d0: 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a 23 65 6e  fileId.ino);.#en
b6e0: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  dif.}.../*.** Ch
b6f0: 65 63 6b 20 61 20 75 6e 69 78 46 69 6c 65 20 74  eck a unixFile t
b700: 68 61 74 20 69 73 20 61 20 64 61 74 61 62 61 73  hat is a databas
b710: 65 2e 20 20 56 65 72 69 66 79 20 74 68 65 20 66  e.  Verify the f
b720: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
b730: 28 31 29 20 54 68 65 72 65 20 69 73 20 65 78 61  (1) There is exa
b740: 63 74 6c 79 20 6f 6e 65 20 68 61 72 64 20 6c 69  ctly one hard li
b750: 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  nk on the file.*
b760: 2a 20 28 32 29 20 54 68 65 20 66 69 6c 65 20 69  * (2) The file i
b770: 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63  s not a symbolic
b780: 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65   link.** (3) The
b790: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
b7a0: 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e  en renamed or un
b7b0: 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73  linked.**.** Iss
b7c0: 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  ue sqlite3_log(S
b7d0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e  QLITE_WARNING,..
b7e0: 2e 29 20 6d 65 73 73 61 67 65 73 20 69 66 20 61  .) messages if a
b7f0: 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f 74 20 72  nything is not r
b800: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
b810: 76 6f 69 64 20 76 65 72 69 66 79 44 62 46 69 6c  void verifyDbFil
b820: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
b830: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  e){.  struct sta
b840: 74 20 62 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b  t buf;.  int rc;
b850: 0a 0a 20 20 2f 2a 20 54 68 65 73 65 20 76 65 72  ..  /* These ver
b860: 69 66 69 63 61 74 69 6f 6e 73 20 6f 63 63 75 72  ifications occur
b870: 73 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  s for the main d
b880: 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 2a 2f 0a  atabase only */.
b890: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
b8a0: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
b8b0: 45 5f 4e 4f 4c 4f 43 4b 20 29 20 72 65 74 75 72  E_NOLOCK ) retur
b8c0: 6e 3b 0a 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  n;..  rc = osFst
b8d0: 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
b8e0: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
b8f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b900: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b910: 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74  G, "cannot fstat
b920: 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46   db file %s", pF
b930: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
b940: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
b950: 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d  f( buf.st_nlink=
b960: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
b970: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
b980: 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69  NING, "file unli
b990: 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a  nked while open:
b9a0: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
b9b0: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  th);.    return;
b9c0: 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73  .  }.  if( buf.s
b9d0: 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20  t_nlink>1 ){.   
b9e0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b9f0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75  ITE_WARNING, "mu
ba00: 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20  ltiple links to 
ba10: 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c 65  file: %s", pFile
ba20: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
ba30: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
ba40: 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69  fileHasMoved(pFi
ba50: 6c 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  le) ){.    sqlit
ba60: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
ba70: 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e  RNING, "file ren
ba80: 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a  amed while open:
ba90: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
baa0: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  th);.    return;
bab0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  .  }.}.../*.** T
bac0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
bad0: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
bae0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
baf0: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
bb00: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
bb10: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
bb20: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
bb30: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
bb40: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
bb50: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
bb60: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
bb70: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
bb80: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
bb90: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
bba0: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
bbb0: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
bbc0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
bbd0: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
bbe0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
bbf0: 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72  t unixCheckReser
bc00: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
bc10: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
bc20: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
bc30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
bc40: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
bc50: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
bc60: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
bc70: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
bc80: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
bc90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
bca0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
bcb0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
bcc0: 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  File );.  assert
bcd0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
bce0: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
bcf0: 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
bd00: 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
bd10: 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
bd20: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
bd30: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
bd40: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
bd50: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
bd60: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
bd70: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
bd80: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
bd90: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
bda0: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
bdb0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ved = 1;.  }..  
bdc0: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
bdd0: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
bde0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
bdf0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  .  */.#ifndef __
be00: 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72  DJGPP__.  if( !r
be10: 65 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c  eserved && !pFil
be20: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
be30: 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73  essLock ){.    s
be40: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
be50: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
be60: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
be70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
be80: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
be90: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
bea0: 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c   = 1;.    lock.l
beb0: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
bec0: 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  .    if( osFcntl
bed0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54  (pFile->h, F_GET
bee0: 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  LK, &lock) ){.  
bef0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
bf00: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
bf10: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  VEDLOCK;.      s
bf20: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
bf30: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
bf40: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
bf50: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
bf60: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
bf70: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
bf80: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e  }.#endif.  .  un
bf90: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
bfa0: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
bfb0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
bfc0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
bfd0: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
bfe0: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
bff0: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
c000: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c010: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
c020: 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63  set a system-loc
c030: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46  k on the file pF
c040: 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ile.  The lock i
c050: 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  s .** described 
c060: 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  by pLock..**.** 
c070: 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73  If the pFile was
c080: 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
c090: 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63  te from unix-exc
c0a0: 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79  l, then the only
c0b0: 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62   lock.** ever ob
c0c0: 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63  tained is an exc
c0d0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64  lusive lock, and
c0e0: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
c0f0: 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20  exactly once.** 
c100: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
c110: 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d  ny lock is attem
c120: 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65  pted.  All subse
c130: 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63  quent system loc
c140: 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  king.** operatio
c150: 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73  ns become no-ops
c160: 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  .  Locking opera
c170: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70  tions still happ
c180: 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a  en internally,.*
c190: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
c1a0: 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20  ordinate access 
c1b0: 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65  between separate
c1c0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
c1d0: 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20  tions.** within 
c1e0: 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75  this process, bu
c1f0: 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73  t all of that is
c200: 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f   handled in memo
c210: 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70  ry and the.** op
c220: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64  erating system d
c230: 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70  oes not particip
c240: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
c250: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61  function is a pa
c260: 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63  ss-through to fc
c270: 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20  ntl(F_SETLK) if 
c280: 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a  pFile is using.*
c290: 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20  * any VFS other 
c2a0: 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  than "unix-excl"
c2b0: 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20   or if pFile is 
c2c0: 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d  opened on "unix-
c2d0: 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20  excl".** and is 
c2e0: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  read-only..**.**
c2f0: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
c300: 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f  d if the call co
c310: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
c320: 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61  ully, or -1 if a
c330: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74   call.** to fcnt
c340: 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68  l() fails. In th
c350: 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69  is case, errno i
c360: 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74  s set appropriat
c370: 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29  ely (by fcntl())
c380: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c390: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69  unixFileLock(uni
c3a0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74  xFile *pFile, st
c3b0: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63  ruct flock *pLoc
c3c0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  k){.  int rc;.  
c3d0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
c3e0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
c3f0: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
c400: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
c410: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
c420: 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  node!=0 );.  if(
c430: 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
c440: 67 73 20 26 20 28 55 4e 49 58 46 49 4c 45 5f 45  gs & (UNIXFILE_E
c450: 58 43 4c 7c 55 4e 49 58 46 49 4c 45 5f 52 44 4f  XCL|UNIXFILE_RDO
c460: 4e 4c 59 29 29 3d 3d 55 4e 49 58 46 49 4c 45 5f  NLY))==UNIXFILE_
c470: 45 58 43 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  EXCL ){.    if( 
c480: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
c490: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
c4a0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
c4b0: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
c4c0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
c4d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
c4e0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
c4f0: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
c500: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
c510: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
c520: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
c530: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
c540: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
c550: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
c560: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
c570: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
c580: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
c590: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
c5a0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
c5b0: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
c5c0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
c5d0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
c5e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
c5f0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
c600: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
c610: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
c620: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
c630: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c640: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
c650: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
c660: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
c670: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
c680: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
c690: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
c6a0: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
c6b0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
c6c0: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
c6d0: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
c6e0: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
c6f0: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
c700: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
c710: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
c720: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
c730: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
c740: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
c750: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
c760: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
c770: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
c780: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
c790: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
c7a0: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
c7b0: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
c7c0: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
c7d0: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
c7e0: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
c7f0: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
c800: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
c810: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
c820: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
c830: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
c840: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
c850: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
c860: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
c870: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
c880: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
c890: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
c8a0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c8b0: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
c8c0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
c8d0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
c8e0: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
c8f0: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
c900: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
c910: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
c920: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
c930: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
c940: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
c950: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
c960: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
c970: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
c980: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
c990: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
c9a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
c9b0: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
c9c0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c9d0: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
c9e0: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
c9f0: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
ca00: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
ca10: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
ca20: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
ca30: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
ca40: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
ca50: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
ca60: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
ca70: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
ca80: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
ca90: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
caa0: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
cab0: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
cac0: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
cad0: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
cae0: 6c 65 20 77 69 74 68 20 57 69 6e 64 6f 77 73 39  le with Windows9
caf0: 35 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  5 systems simult
cb00: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
cb10: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
cb20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
cb30: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
cb40: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
cb50: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
cb60: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
cb70: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
cb80: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
cb90: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
cba0: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
cbb0: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
cbc0: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
cbd0: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
cbe0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
cbf0: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
cc00: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
cc10: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
cc20: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
cc30: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
cc40: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
cc50: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
cc60: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
cc70: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
cc80: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
cc90: 6c 2c 20 27 73 68 61 72 65 64 20 62 79 74 65 20  l, 'shared byte 
cca0: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
ccb0: 6f 63 6b 65 64 0a 20 20 2a 2a 20 61 6e 64 20 74  ocked.  ** and t
ccc0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
ccd0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
cce0: 6c 65 61 73 65 64 2e 20 20 28 4c 65 67 61 63 79  leased.  (Legacy
ccf0: 20 6e 6f 74 65 3a 20 20 57 68 65 6e 0a 20 20 2a   note:  When.  *
cd00: 2a 20 53 51 4c 69 74 65 20 77 61 73 20 66 69 72  * SQLite was fir
cd10: 73 74 20 64 65 76 65 6c 6f 70 65 64 2c 20 57 69  st developed, Wi
cd20: 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73 20  ndows95 systems 
cd30: 77 65 72 65 20 73 74 69 6c 6c 20 76 65 72 79 20  were still very 
cd40: 63 6f 6d 6d 6f 6e 2c 0a 20 20 2a 2a 20 61 6e 64  common,.  ** and
cd50: 20 57 69 64 6e 6f 77 73 39 35 20 6c 61 63 6b 73   Widnows95 lacks
cd60: 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 63   a shared-lock c
cd70: 61 70 61 62 69 6c 69 74 79 2e 20 20 53 6f 20 6f  apability.  So o
cd80: 6e 20 57 69 6e 64 6f 77 73 39 35 2c 20 61 0a 20  n Windows95, a. 
cd90: 20 2a 2a 20 73 69 6e 67 6c 65 20 72 61 6e 64 6f   ** single rando
cda0: 6d 6c 79 20 73 65 6c 65 63 74 65 64 20 62 79 20  mly selected by 
cdb0: 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64  from the 'shared
cdc0: 20 62 79 74 65 20 72 61 6e 67 65 27 20 69 73 20   byte range' is 
cdd0: 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2a 20 57 69 6e  locked..  ** Win
cde0: 64 6f 77 73 39 35 20 69 73 20 6e 6f 77 20 70 72  dows95 is now pr
cdf0: 65 74 74 79 20 6d 75 63 68 20 65 78 74 69 6e 63  etty much extinc
ce00: 74 2c 20 62 75 74 20 74 68 69 73 20 77 6f 72 6b  t, but this work
ce10: 2d 61 72 6f 75 6e 64 20 66 6f 72 20 74 68 65 0a  -around for the.
ce20: 20 20 2a 2a 20 6c 61 63 6b 20 6f 66 20 73 68 61    ** lack of sha
ce30: 72 65 64 2d 6c 6f 63 6b 73 20 6f 6e 20 57 69 6e  red-locks on Win
ce40: 64 6f 77 73 39 35 20 6c 69 76 65 73 20 6f 6e 2c  dows95 lives on,
ce50: 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73 0a 20   for backwards. 
ce60: 20 2a 2a 20 63 6f 6d 70 61 74 69 62 69 6c 69 74   ** compatibilit
ce70: 79 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  y.).  **.  ** A 
ce80: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
ce90: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
cea0: 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  ED lock after it
ceb0: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f   has a SHARED lo
cec0: 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52  ck..  ** A RESER
ced0: 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  VED lock is impl
cee0: 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62  emented by grabb
cef0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
cf00: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65   on the.  ** 're
cf10: 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20  served byte'. . 
cf20: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
cf30: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
cf40: 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  in a PENDING loc
cf50: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f  k after it has o
cf60: 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53  btained a.  ** S
cf70: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45  HARED lock. A PE
cf80: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d  NDING lock is im
cf90: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
cfa0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
cfb0: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
cfc0: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20  'pending byte'. 
cfd0: 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
cfe0: 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20  t no new SHARED 
cff0: 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a  locks can be.  *
d000: 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20  * obtained, but 
d010: 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20  existing SHARED 
d020: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65  locks are allowe
d030: 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20  d to persist. A 
d040: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65  process.  ** doe
d050: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62  s not have to ob
d060: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
d070: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20  lock on the way 
d080: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
d090: 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f  k..  ** This pro
d0a0: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79  perty is used by
d0b0: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66   the algorithm f
d0c0: 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
d0d0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  a journal file. 
d0e0: 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73   ** after a cras
d0f0: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  h..  **.  ** An 
d100: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
d110: 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61  obtained after a
d120: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
d130: 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69   held, is.  ** i
d140: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
d150: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
d160: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69  lock on the enti
d170: 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  re 'shared byte.
d180: 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e    ** range'. Sin
d190: 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63  ce all other loc
d1a0: 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61  ks require a rea
d1b0: 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  d-lock on one of
d1c0: 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20   the bytes.  ** 
d1d0: 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67  within this rang
d1e0: 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
d1f0: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f  that no other lo
d200: 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20  cks are held on 
d210: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
d220: 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72  e. .  */.  int r
d230: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
d240: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
d250: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
d260: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
d270: 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72  o *pInode;.  str
d280: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
d290: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30    int tErrno = 0
d2a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
d2b0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
d2c0: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
d2d0: 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
d2e0: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
d2f0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
d300: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
d310: 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
d320: 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
d330: 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ck),.      azFil
d340: 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e  eLock(pFile->pIn
d350: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ode->eFileLock),
d360: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
d370: 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 6f  nShared,.      o
d380: 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20  sGetpid(0)));.. 
d390: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
d3a0: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
d3b0: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
d3c0: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
d3d0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
d3e0: 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
d3f0: 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
d400: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
d410: 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
d420: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
d430: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
d440: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
d450: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d460: 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
d470: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
d480: 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
d490: 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 75  already held) (u
d4a0: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
d4b0: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  h,.            a
d4c0: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
d4d0: 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
d4e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d4f0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
d500: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
d510: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
d520: 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20  t..  **  (1) We 
d530: 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20  never move from 
d540: 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74  unlocked to anyt
d550: 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e  hing higher than
d560: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20   shared lock..  
d570: 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e  **  (2) SQLite n
d580: 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20  ever explicitly 
d590: 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69  requests a pendi
d5a0: 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33  g lock..  **  (3
d5b0: 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ) A shared lock 
d5c0: 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77  is always held w
d5d0: 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f  hen a reserve lo
d5e0: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  ck is requested.
d5f0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d600: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d610: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  !=NO_LOCK || eFi
d620: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d630: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
d640: 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44   eFileLock!=PEND
d650: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
d660: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
d670: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
d680: 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  | pFile->eFileLo
d690: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d6a0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  );..  /* This mu
d6b0: 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
d6c0: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
d6d0: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
d6e0: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
d6f0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
d700: 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
d710: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
d720: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
d730: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
d740: 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
d750: 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
d760: 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
d770: 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
d780: 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
d790: 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
d7a0: 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
d7b0: 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
d7c0: 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  k!=pInode->eFile
d7d0: 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20  Lock && .       
d7e0: 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
d7f0: 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
d800: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
d810: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
d820: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
d830: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
d840: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
d850: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52  ..  /* If a SHAR
d860: 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
d870: 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
d880: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
d890: 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
d8a0: 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
d8b0: 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
d8c0: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
d8d0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
d8e0: 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
d8f0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
d900: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
d910: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
d920: 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d   .      (pInode-
d930: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
d940: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
d950: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
d960: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
d970: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
d980: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d990: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
d9a0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
d9b0: 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
d9c0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
d9d0: 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
d9e0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
d9f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
da00: 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
da10: 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
da20: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
da30: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
da40: 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e  ...  /* A PENDIN
da50: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
da60: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
da70: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
da80: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
da90: 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
daa0: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
dab0: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
dac0: 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
dad0: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
dae0: 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63  ased..  */.  loc
daf0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
db00: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
db10: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20  SEEK_SET;.  if( 
db20: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
db30: 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
db40: 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43   (eFileLock==EXC
db50: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
db60: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
db70: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
db80: 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  ){.    lock.l_ty
db90: 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  pe = (eFileLock=
dba0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52  =SHARED_LOCK?F_R
dbb0: 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20  DLCK:F_WRLCK);. 
dbc0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
dbd0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
dbe0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
dbf0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
dc00: 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  k) ){.      tErr
dc10: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
dc20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
dc30: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
dc40: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
dc50: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
dc60: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
dc70: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
dc80: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
dc90: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
dca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
dcb0: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
dcc0: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49    }.  }...  /* I
dcd0: 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
dce0: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
dcf0: 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
dd00: 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
dd10: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
dd20: 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
dd30: 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
dd40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
dd50: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
dd60: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
dd70: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
dd80: 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
dd90: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
dda0: 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
ddb0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
ddc0: 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
ddd0: 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
dde0: 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  ad-lock */.    l
ddf0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
de00: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
de10: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
de20: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66  RED_SIZE;.    if
de30: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
de40: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
de50: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
de60: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
de70: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
de80: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
de90: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
dea0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  LOCK);.    }..  
deb0: 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
dec0: 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
ded0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
dee0: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
def0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
df00: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
df10: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
df20: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_UNLCK;.    if(
df30: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
df40: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72  ile, &lock) && r
df50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
df60: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
df70: 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20  uld happen with 
df80: 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20  a network mount 
df90: 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  */.      tErrno 
dfa0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
dfb0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
dfc0: 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a  _UNLOCK; .    }.
dfd0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
dfe0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
dff0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
e000: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
e010: 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
e020: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e030: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
e040: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e050: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e060: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
e070: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
e080: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
e090: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
e0a0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
e0b0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
e0c0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
e0d0: 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
e0e0: 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
e0f0: 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
e100: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
e110: 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
e120: 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
e130: 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
e140: 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
e150: 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
e160: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
e170: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
e180: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
e190: 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
e1a0: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
e1b0: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
e1c0: 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
e1d0: 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
e1e0: 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
e1f0: 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
e200: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
e210: 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
e220: 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
e230: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
e240: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
e250: 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61   F_WRLCK;..    a
e260: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
e270: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
e280: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  || eFileLock==EX
e290: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
e2a0: 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63      if( eFileLoc
e2b0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
e2c0: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
e2d0: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
e2e0: 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f  D_BYTE;.      lo
e2f0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
e300: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e310: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
e320: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
e330: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e340: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
e350: 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78   }..    if( unix
e360: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
e370: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
e380: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e390: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e3a0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
e3b0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
e3c0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
e3d0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
e3e0: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
e3f0: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
e400: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
e410: 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
e420: 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65   }.  }.  ..#ifde
e430: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
e440: 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74   /* Set up the t
e450: 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74  ransaction-count
e460: 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69  er change checki
e470: 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20  ng flags when.  
e480: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  ** transitioning
e490: 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74   from a SHARED t
e4a0: 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  o a RESERVED loc
e4b0: 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20  k.  The change. 
e4c0: 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20   ** from SHARED 
e4d0: 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b  to RESERVED mark
e4e0: 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  s the beginning 
e4f0: 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a  of a normal.  **
e500: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
e510: 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72   (not a hot jour
e520: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20  nal rollback).. 
e530: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
e540: 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46  LITE_OK.   && pF
e550: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
e560: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26  SHARED_LOCK.   &
e570: 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  & eFileLock==RES
e580: 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a  ERVED_LOCK.  ){.
e590: 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
e5a0: 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20  CntrChng = 0;.  
e5b0: 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
e5c0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
e5d0: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
e5e0: 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 1;.  }.#endif.
e5f0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
e600: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
e610: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
e620: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
e630: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e640: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
e650: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
e660: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
e670: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
e680: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
e690: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
e6a0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e6b0: 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
e6c0: 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a  ;.  }..end_lock:
e6d0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
e6e0: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
e6f0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
e700: 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  s (unix)\n", pFi
e710: 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
e720: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
e730: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
e740: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
e750: 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
e760: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
e770: 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  d the file descr
e780: 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69  iptor used by fi
e790: 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20  le handle pFile 
e7a0: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
e7b0: 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20  ding.** pUnused 
e7c0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
e7d0: 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46  void setPendingF
e7e0: 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
e7f0: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
e800: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
e810: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55  ile->pInode;.  U
e820: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d  nixUnusedFd *p =
e830: 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b   pFile->pUnused;
e840: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49  .  p->pNext = pI
e850: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  node->pUnused;. 
e860: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
e870: 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68   = p;.  pFile->h
e880: 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e   = -1;.  pFile->
e890: 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a  pUnused = 0;.}..
e8a0: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
e8b0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
e8c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
e8d0: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
e8e0: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
e8f0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
e900: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
e910: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
e920: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
e930: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
e940: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
e950: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
e960: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
e970: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
e980: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
e990: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
e9a0: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
e9b0: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
e9c0: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
e9d0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
e9e0: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
e9f0: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
ea00: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
ea10: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
ea20: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
ea30: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
ea40: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
ea50: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
ea60: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
ea70: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
ea80: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
ea90: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
eaa0: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
eab0: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
eac0: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
ead0: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
eae0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
eaf0: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
eb00: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
eb10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
eb20: 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c   posixUnlock(sql
eb30: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
eb40: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e  nt eFileLock, in
eb50: 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  t handleNFSUnloc
eb60: 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  k){.  unixFile *
eb70: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
eb80: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
eb90: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
eba0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
ebb0: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
ebc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
ebd0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
ebe0: 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
ebf0: 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
ec00: 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %d,%d) pid=%d (u
ec10: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
ec20: 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
ec30: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
ec40: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
ec50: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ode->eFileLock, 
ec60: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
ec70: 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73  Shared,.      os
ec80: 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
ec90: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
eca0: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
ecb0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
ecc0: 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
ecd0: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
ece0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
ecf0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
ed00: 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
ed10: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
ed20: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
ed30: 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
ed40: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
ed50: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
ed60: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
ed70: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
ed80: 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
ed90: 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20  Lock );..#ifdef 
eda0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
edb0: 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
edc0: 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
edd0: 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
ede0: 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
edf0: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
ee00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
ee10: 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
ee20: 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
ee30: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
ee40: 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
ee50: 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
ee60: 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
ee70: 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
ee80: 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
ee90: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
eea0: 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
eeb0: 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
eec0: 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
eed0: 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
eee0: 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
eef0: 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
ef00: 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
ef10: 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
ef20: 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
ef30: 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
ef40: 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
ef50: 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
ef60: 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
ef70: 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
ef80: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
ef90: 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23  rmalWrite = 0;.#
efa0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f  endif..    /* do
efb0: 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73  wngrading to a s
efc0: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46  hared lock on NF
efd0: 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72  S involves clear
efe0: 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ing the write lo
eff0: 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ck.    ** before
f000: 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68   establishing th
f010: 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20  e readlock - to 
f020: 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e  avoid a race con
f030: 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72  dition we downgr
f040: 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  ade.    ** the l
f050: 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c  ock in 2 blocks,
f060: 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66   so that part of
f070: 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20   the range will 
f080: 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  be covered by a 
f090: 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f  .    ** write lo
f0a0: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73  ck until the res
f0b0: 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20  t is covered by 
f0c0: 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20  a read lock:.   
f0d0: 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57   **  1:   [WWWWW
f0e0: 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b  ].    **  2:   [
f0f0: 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33  ....W].    **  3
f100: 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20  :   [RRRRW].    
f110: 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d  **  4:   [RRRR.]
f120: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f130: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
f140: 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69 66 20 21 64  D_LOCK ){.#if !d
f150: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
f160: 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41  ) || !SQLITE_ENA
f170: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
f180: 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61  E.      (void)ha
f190: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20  ndleNFSUnlock;. 
f1a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e       assert( han
f1b0: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20  dleNFSUnlock==0 
f1c0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
f1d0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
f1e0: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
f1f0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
f200: 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65        if( handle
f210: 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20  NFSUnlock ){.   
f220: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b       int tErrno;
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f240: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
f250: 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72  m system call er
f260: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rors */.        
f270: 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20  off_t divSize = 
f280: 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b  SHARED_SIZE - 1;
f290: 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
f2a0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f2b0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
f2c0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f2d0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f2e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f2f0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
f300: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
f310: 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20  en = divSize;.  
f320: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
f330: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f340: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
f350: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
f360: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
f370: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
f380: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
f390: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
f3a0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
f3b0: 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  no);.          g
f3c0: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
f3d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f3e0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f3f0: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
f400: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f410: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f420: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f430: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
f440: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
f450: 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20  en = divSize;.  
f460: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
f470: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f480: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
f490: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
f4a0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
f4b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
f4c0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
f4d0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
f4e0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20  IOERR_RDLOCK);. 
f4f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
f500: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
f510: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
f520: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
f530: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
f540: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f550: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
f560: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
f570: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
f580: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
f590: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f5a0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f5b0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
f5c0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f5d0: 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ST+divSize;.    
f5e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f5f0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76   SHARED_SIZE-div
f600: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
f610: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f620: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  File, &lock)==(-
f630: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
f640: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
f650: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
f660: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f670: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  CK;.          st
f680: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
f690: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
f6a0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
f6b0: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
f6c0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
f6d0: 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
f6e0: 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
f6f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
f700: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20  ING_STYLE */.   
f710: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63     {.        loc
f720: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
f730: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
f740: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
f750: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
f760: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
f770: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
f780: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
f790: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
f7a0: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
f7b0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f7c0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ck) ){.         
f7d0: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74   /* In theory, t
f7e0: 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46  he call to unixF
f7f0: 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74  ileLock() cannot
f800: 20 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e   fail because an
f810: 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  other.          
f820: 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  ** process is ho
f830: 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61  lding an incompa
f840: 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69  tible lock. If i
f850: 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20  t does, this .  
f860: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63          ** indic
f870: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74  ates that the ot
f880: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
f890: 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ot following the
f8a0: 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20   locking.       
f8b0: 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20     ** protocol. 
f8c0: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
f8d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
f8e0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74  OERR_RDLOCK. Ret
f8f0: 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  urning.         
f900: 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   ** SQLITE_BUSY 
f910: 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68  would confuse th
f920: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69  e upper layer (i
f930: 6e 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61  n practice it ca
f940: 75 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20  uses .          
f950: 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20  ** an assert to 
f960: 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20  fail). */ .     
f970: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f980: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20  _IOERR_RDLOCK;. 
f990: 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
f9a0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
f9b0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
f9c0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
f9d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f9e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
f9f0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
fa00: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
fa10: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
fa20: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
fa30: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
fa40: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
fa50: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
fa60: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
fa70: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
fa80: 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  );.    if( unixF
fa90: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
faa0: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
fab0: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
fac0: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
fad0: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
fae0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
faf0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
fb00: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
fb10: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
fb20: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
fb30: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  _unlock;.    }. 
fb40: 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f   }.  if( eFileLo
fb50: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck==NO_LOCK ){. 
fb60: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
fb70: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
fb80: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
fb90: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
fba0: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
fbb0: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
fbc0: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
fbd0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
fbe0: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
fbf0: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
fc00: 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
fc10: 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
fc20: 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
fc30: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  ed==0 ){.      l
fc40: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
fc50: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  NLCK;.      lock
fc60: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
fc70: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
fc80: 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
fc90: 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
fca0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
fcb0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
fcc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
fcd0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
fce0: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
fcf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
fd00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
fd10: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
fd20: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
fd30: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
fd40: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
fd50: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
fd60: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
fd70: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
fd80: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
fd90: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
fda0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
fdb0: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
fdc0: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
fdd0: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
fde0: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
fdf0: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
fe00: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
fe10: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
fe20: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
fe30: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
fe40: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
fe50: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
fe60: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
fe70: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
fe80: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
fe90: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
fea0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
feb0: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
fec0: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
fed0: 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e     }.  }..end_un
fee0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
fef0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
ff00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
ff10: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ff20: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
ff30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ff40: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
ff50: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
ff60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
ff70: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
ff80: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
ff90: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
ffa0: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
ffb0: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
ffc0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
ffd0: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
ffe0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
fff0: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
10000 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
10010 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
10020 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10030 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
10040 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
10050 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10060 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
10070 63 6b 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ck){.#if SQLITE_
10080 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
10090 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
100a0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
100b0 20 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a   || ((unixFile *
100c0 29 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  )id)->nFetchOut=
100d0 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  =0 );.#endif.  r
100e0 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63  eturn posixUnloc
100f0 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  k(id, eFileLock,
10100 20 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   0);.}..#if SQLI
10110 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
10120 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  >0.static int un
10130 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  ixMapfile(unixFi
10140 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79  le *pFd, i64 nBy
10150 74 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  te);.static void
10160 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75   unixUnmapfile(u
10170 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23  nixFile *pFd);.#
10180 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
10190 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
101a0 72 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66  rms the parts of
101b0 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65   the "close file
101c0 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20  " operation .** 
101d0 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
101e0 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49  cking schemes. I
101f0 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72  t closes the dir
10200 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a  ectory and file.
10210 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74  ** handles, if t
10220 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61  hey are valid, a
10230 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c  nd sets all fiel
10240 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ds of the unixFi
10250 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
10260 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  to 0..**.** It i
10270 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72  s *not* necessar
10280 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  y to hold the mu
10290 74 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f  tex when this ro
102a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
102b0 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f  .** even on VxWo
102c0 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69  rks.  A mutex wi
102d0 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f  ll be acquired o
102e0 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65  n VxWorks by the
102f0 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  .** vxworksRelea
10300 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69  seFileId() routi
10310 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
10320 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  t closeUnixFile(
10330 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10340 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
10350 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10360 2a 29 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45  *)id;.#if SQLITE
10370 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
10380 0a 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  .  unixUnmapfile
10390 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
103a0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
103b0 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f  0 ){.    robust_
103c0 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69  close(pFile, pFi
103d0 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  le->h, __LINE__)
103e0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ;.    pFile->h =
103f0 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f   -1;.  }.#if OS_
10400 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46  VXWORKS.  if( pF
10410 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20  ile->pId ){.    
10420 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
10430 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
10440 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20  DELETE ){.      
10450 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e  osUnlink(pFile->
10460 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
10470 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
10480 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
10490 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29  leId(pFile->pId)
104a0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64  ;.    pFile->pId
104b0 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
104c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
104d0 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53  NLINK_AFTER_CLOS
104e0 45 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  E.  if( pFile->c
104f0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
10500 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  ILE_DELETE ){.  
10510 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65    osUnlink(pFile
10520 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71  ->zPath);.    sq
10530 6c 69 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61  lite3_free(*(cha
10540 72 2a 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74  r**)&pFile->zPat
10550 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a  h);.    pFile->z
10560 50 61 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  Path = 0;.  }.#e
10570 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28  ndif.  OSTRACE((
10580 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22  "CLOSE   %-3d\n"
10590 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
105a0 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
105b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
105c0 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b  pFile->pUnused);
105d0 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c  .  memset(pFile,
105e0 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
105f0 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ile));.  return 
10600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10610 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
10620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10630 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65  unixClose(sqlite
10640 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
10650 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10660 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
10670 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10680 20 2a 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44   *)id;.  verifyD
10690 62 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20  bFile(pFile);.  
106a0 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  unixUnlock(id, N
106b0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45  O_LOCK);.  unixE
106c0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
106d0 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f  /* unixFile.pIno
106e0 64 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  de is always val
106f0 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69  id here. Otherwi
10700 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20  se, a different 
10710 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69  close.  ** routi
10720 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43  ne (e.g. nolockC
10730 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65  lose()) would be
10740 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e   called instead.
10750 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
10760 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
10770 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d  Lock>0 || pFile-
10780 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
10790 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66  sLock==0 );.  if
107a0 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e  ( ALWAYS(pFile->
107b0 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65  pInode) && pFile
107c0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
107d0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
107e0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
107f0 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
10800 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
10810 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
10820 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
10830 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
10840 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
10850 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
10860 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73   file.    ** des
10870 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
10880 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  e->pUnused list.
10890 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
108a0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
108b0 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  d .    ** when t
108c0 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
108d0 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  cleared..    */.
108e0 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64      setPendingFd
108f0 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFile);.  }.  r
10900 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
10910 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63  pFile);.  rc = c
10920 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
10930 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
10940 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
10950 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  c;.}../*********
10960 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
10970 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
10980 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
10990 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
109a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
109b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109f0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
10a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a40 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a60 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b  ***** No-op Lock
10a70 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
10a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a90 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20  ******.**.** Of 
10aa0 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  the various lock
10ab0 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
10ac0 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74  ons available, t
10ad0 68 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68  his is by far th
10ae0 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20  e.** simplest:  
10af0 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72  locking is ignor
10b00 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20  ed.  No attempt 
10b10 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20  is made to lock 
10b20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10b30 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67  file for reading
10b40 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   or writing..**.
10b50 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20  ** This locking 
10b60 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69  mode is appropri
10b70 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72  ate for use on r
10b80 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
10b90 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62  es.** (ex: datab
10ba0 61 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75  ases that are bu
10bb0 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d  rned into CD-ROM
10bc0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20  , for example.) 
10bd0 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20   It can.** also 
10be0 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61  be used if the a
10bf0 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f  pplication emplo
10c00 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c  ys some external
10c10 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a   mechanism to.**
10c20 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61   prevent simulta
10c30 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20  neous access of 
10c40 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
10c50 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e by two or more
10c60 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
10c70 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74  nections.  But t
10c80 68 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75  here is a seriou
10c90 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61  s risk of databa
10ca0 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  se.** corruption
10cb0 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   if this locking
10cc0 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e   mode is used in
10cd0 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72   situations wher
10ce0 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61  e multiple.** da
10cf0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10d00 6e 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67  ns are accessing
10d10 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
10d20 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
10d30 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20  ame.** time and 
10d40 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
10d50 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  hose connections
10d60 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f   are writing..*/
10d70 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  ..static int nol
10d80 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
10d90 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
10da0 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
10db0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55  *pResOut){.  UNU
10dc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
10dd0 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f  tUsed);.  *pResO
10de0 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ut = 0;.  return
10df0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
10e00 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c  atic int nolockL
10e10 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10e20 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
10e30 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
10e40 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
10e50 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
10e60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10e70 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
10e80 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  nt nolockUnlock(
10e90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
10ea0 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
10eb0 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
10ec0 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
10ed0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
10ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
10f00 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
10f10 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
10f20 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
10f30 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72  e *id) {.  retur
10f40 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
10f50 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  id);.}../*******
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
10f70 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f   of the no-op lo
10f80 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
10f90 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
10fa0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11040 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
11050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11060 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c  ** Begin dot-fil
11070 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
11080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11090 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
110a0 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  he dotfile locki
110b0 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
110c0 6e 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74  n uses the exist
110d0 65 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65  ence of separate
110e0 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28   lock.** files (
110f0 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f  really a directo
11100 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  ry) to control a
11110 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
11120 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72  abase.  This wor
11130 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62  ks.** on just ab
11140 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79  out every filesy
11150 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e  stem imaginable.
11160 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20    But there are 
11170 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65  serious downside
11180 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
11190 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63   There is zero c
111a0 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73  oncurrency.  A s
111b0 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f  ingle reader blo
111c0 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a  cks all other.**
111d0 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
111e0 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e  ions from readin
111f0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
11200 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
11210 20 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c      (2)  An appl
11220 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72  ication crash or
11230 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20   power loss can 
11240 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b  leave stale lock
11250 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20   files.**       
11260 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64    sitting around
11270 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
11280 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c   cleared manuall
11290 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68  y..**.** Neverth
112a0 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b  eless, a dotlock
112b0 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61   is an appropria
112c0 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  te locking mode 
112d0 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a  for use if no.**
112e0 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73   other locking s
112f0 74 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c  trategy is avail
11300 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66  able..**.** Dotf
11310 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  ile locking work
11320 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  s by creating a 
11330 73 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20  subdirectory in 
11340 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
11350 72 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74  ry as.** the dat
11360 61 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74  abase and with t
11370 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74  he same name but
11380 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20   with a ".lock" 
11390 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e  extension added.
113a0 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63  .** The existenc
113b0 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65  e of a lock dire
113c0 63 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e  ctory implies an
113d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
113e0 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c    All other.** l
113f0 6f 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45  ock types (SHARE
11400 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e  D, RESERVED, PEN
11410 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64  DING) are mapped
11420 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e   into EXCLUSIVE.
11430 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .*/../*.** The f
11440 69 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64  ile suffix added
11450 20 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73   to the data bas
11460 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72  e filename in or
11470 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  der to create th
11480 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74  e.** lock direct
11490 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ory..*/.#define 
114a0 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22  DOTLOCK_SUFFIX "
114b0 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  .lock"../*.** Th
114c0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
114d0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
114e0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
114f0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
11500 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
11510 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
11520 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
11530 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
11540 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
11550 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
11560 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
11570 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
11580 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
11590 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
115a0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
115b0 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
115c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
115d0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
115e0 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66  g..**.** In dotf
115f0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74  ile locking, eit
11600 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74  her a lock exist
11610 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74  s or it does not
11620 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a  .  So in this.**
11630 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68   variation of Ch
11640 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
11650 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  ), *pResOut is s
11660 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e  et to true if an
11670 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c  y lock.** is hel
11680 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  d on the file an
11690 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66  d false if the f
116a0 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
116b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
116c0 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
116d0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
116e0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
116f0 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
11700 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11710 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
11720 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
11730 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11740 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
11750 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
11760 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
11770 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
11780 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
11790 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 72 65 73  ( pFile );.  res
117a0 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73  erved = osAccess
117b0 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46  ((const char*)pF
117c0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
117d0 65 78 74 2c 20 30 29 3d 3d 30 3b 0a 20 20 4f 53  ext, 0)==0;.  OS
117e0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
117f0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 64  LOCK %d %d %d (d
11800 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  otlock)\n", pFil
11810 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
11820 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  ed));.  *pResOut
11830 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
11840 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11850 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
11860 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
11870 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
11880 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
11890 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
118a0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
118b0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
118c0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
118d0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
118e0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
118f0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
11900 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
11910 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
11920 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
11930 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
11940 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
11950 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
11960 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
11970 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
11980 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
11990 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
119a0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
119b0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
119c0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
119d0 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
119e0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
119f0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
11a00 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
11a10 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
11a20 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
11a30 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
11a40 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
11a50 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
11a60 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
11a70 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
11a80 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
11a90 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
11aa0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
11ab0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
11ac0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
11ad0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11ae0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
11af0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
11b00 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11b10 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
11b20 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
11b30 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
11b40 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
11b50 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
11b60 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a  ocking level..**
11b70 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c 65  .** With dotfile
11b80 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65 61   locking, we rea
11b90 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  lly only support
11ba0 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43 4c   state (4): EXCL
11bb0 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65  USIVE..** But we
11bc0 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65 72   track the other
11bd0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
11be0 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73  internally..*/.s
11bf0 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
11c00 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
11c10 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
11c20 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
11c30 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11c40 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
11c50 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
11c60 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
11c70 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
11c80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11c90 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77  _OK;...  /* If w
11ca0 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c  e have any lock,
11cb0 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66   then the lock f
11cc0 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ile already exis
11cd0 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65  ts.  All we have
11ce0 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61  .  ** to do is a
11cf0 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e  djust our intern
11d00 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  al record of the
11d10 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a   lock level..  *
11d20 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
11d30 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
11d40 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
11d50 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
11d60 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41  leLock;.    /* A
11d70 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65  lways update the
11d80 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68   timestamp on th
11d90 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69  e old file */.#i
11da0 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a  fdef HAVE_UTIME.
11db0 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46      utime(zLockF
11dc0 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73  ile, NULL);.#els
11dd0 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f  e.    utimes(zLo
11de0 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23  ckFile, NULL);.#
11df0 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
11e00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11e10 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
11e20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
11e30 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72  /.  rc = osMkdir
11e40 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37  (zLockFile, 0777
11e50 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b  );.  if( rc<0 ){
11e60 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74  .    /* failed t
11e70 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
11e80 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  e lock directory
11e90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72   */.    int tErr
11ea0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
11eb0 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45  if( EEXIST == tE
11ec0 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
11ed0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
11ee0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
11ef0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
11f00 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
11f10 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
11f20 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
11f30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11f40 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
11f50 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
11f60 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
11f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11f80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11f90 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20   } .  .  /* got 
11fa0 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
11fb0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
11fc0 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
11fd0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
11fe0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11ff0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
12000 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12010 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
12020 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
12030 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
12040 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
12050 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
12060 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
12070 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
12080 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
12090 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
120a0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
120b0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
120c0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
120d0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
120e0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
120f0 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
12100 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
12110 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
12120 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
12130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12140 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
12150 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12160 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
12170 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12180 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
12190 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
121a0 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
121b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
121c0 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ntext;.  int rc;
121d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
121e0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
121f0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
12200 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f  as %d pid=%d (do
12210 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
12220 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
12230 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
12240 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47  ->eFileLock, osG
12250 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73  etpid(0)));.  as
12260 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
12270 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
12280 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
12290 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
122a0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
122b0 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
122c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
122d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
122e0 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74  * To downgrade t
122f0 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79  o shared, simply
12300 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
12310 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74  rnal notion of t
12320 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61  he.  ** lock sta
12330 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  te.  No need to 
12340 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69  mess with the fi
12350 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  le on disk..  */
12360 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
12370 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
12380 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
12390 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
123a0 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
123b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
123c0 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20   .  /* To fully 
123d0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
123e0 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
123f0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61  lock file */.  a
12400 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
12410 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72  ==NO_LOCK );.  r
12420 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63  c = osRmdir(zLoc
12430 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  kFile);.  if( rc
12440 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45  <0 ){.    int tE
12450 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12460 20 20 69 66 28 20 74 45 72 72 6e 6f 3d 3d 45 4e    if( tErrno==EN
12470 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 63  OENT ){.      rc
12480 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
124a0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
124b0 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  _UNLOCK;.      s
124c0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
124d0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
124e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
124f0 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
12500 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
12510 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
12520 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12530 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
12540 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
12550 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65  lock has been re
12560 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c  leased before cl
12570 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  osing..*/.static
12580 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73   int dotlockClos
12590 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
125a0 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  id) {.  unixFile
125b0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
125c0 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72  ile*)id;.  asser
125d0 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 64 6f  t( id!=0 );.  do
125e0 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  tlockUnlock(id, 
125f0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69  NO_LOCK);.  sqli
12600 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
12610 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
12620 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
12630 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 2f  nixFile(id);.}./
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12650 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f  ** End of the do
12660 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c  t-file lock impl
12670 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
12690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
126e0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
126f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
12750 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a   flock Locking *
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12780 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c  **.** Use the fl
12790 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ock() system cal
127a0 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63  l to do file loc
127b0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  king..**.** floc
127c0 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  k() locking is l
127d0 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  ike dot-file loc
127e0 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65  king in that the
127f0 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65   various.** fine
12800 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c  -grain locking l
12810 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20  evels supported 
12820 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f  by SQLite are co
12830 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20  llapsed into.** 
12840 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69  a single exclusi
12850 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68  ve lock.  In oth
12860 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44  er words, SHARED
12870 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a  , RESERVED, and.
12880 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73  ** PENDING locks
12890 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68   are the same th
128a0 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53  ing as an EXCLUS
128b0 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74  IVE lock.  SQLit
128c0 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73  e.** still works
128d0 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69   when you do thi
128e0 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e  s, but concurren
128f0 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69  cy is reduced si
12900 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  nce.** only a si
12910 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
12920 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
12930 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69  database at a ti
12940 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74  me..**.** Omit t
12950 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53  his section if S
12960 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
12970 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75  KING_STYLE is tu
12980 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20  rned off.*/.#if 
12990 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
129a0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a  CKING_STYLE../*.
129b0 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29  ** Retry flock()
129c0 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
129d0 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23   with EINTR.*/.#
129e0 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74  ifdef EINTR.stat
129f0 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c  ic int robust_fl
12a00 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ock(int fd, int 
12a10 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  op){.  int rc;. 
12a20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28   do{ rc = flock(
12a30 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20  fd,op); }while( 
12a40 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
12a50 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
12a60 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64   rc;.}.#else.# d
12a70 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f  efine robust_flo
12a80 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c  ck(a,b) flock(a,
12a90 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a  b).#endif.     .
12aa0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12ab0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
12ac0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
12ad0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
12ae0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
12af0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
12b00 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
12b10 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
12b20 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
12b30 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
12b40 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
12b50 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
12b60 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
12b70 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
12b80 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
12b90 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
12ba0 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
12bb0 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
12bc0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
12bd0 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
12be0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
12bf0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12c00 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
12c10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12c20 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
12c30 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
12c40 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12c50 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12c60 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
12c70 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
12c80 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
12c90 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
12ca0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
12cb0 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65  e );.  .  /* Che
12cc0 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
12cd0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
12ce0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
12cf0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
12d00 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
12d10 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
12d20 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
12d30 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
12d40 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
12d50 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
12d60 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
12d70 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
12d80 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  /* attempt to ge
12d90 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  t the lock */.  
12da0 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75    int lrc = robu
12db0 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
12dc0 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
12dd0 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21  K_NB);.    if( !
12de0 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
12df0 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e  got the lock, un
12e00 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20  lock it */.     
12e10 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c   lrc = robust_fl
12e20 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
12e30 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66  CK_UN);.      if
12e40 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20   ( lrc ) {.     
12e50 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
12e60 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f  errno;.        /
12e70 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20  * unlock failed 
12e80 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f  with an error */
12e90 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53  .        lrc = S
12ea0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
12eb0 43 4b 3b 20 0a 20 20 20 20 20 20 20 20 73 74 6f  CK; .        sto
12ec0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
12ed0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
12ee0 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
12ef0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
12f00 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72   {.      int tEr
12f10 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
12f20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
12f30 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e  .      /* someon
12f40 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76  e else might hav
12f50 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f  e it reserved */
12f60 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c  .      lrc = sql
12f70 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
12f80 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
12f90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
12fa0 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53  ); .      if( IS
12fb0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
12fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
12fd0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
12fe0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
12ff0 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
13000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
13010 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
13020 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
13030 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
13040 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
13050 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53  ved));..#ifdef S
13060 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
13070 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
13080 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
13090 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
130a0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
130b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
130c0 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a      reserved=1;.
130d0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
130e0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
130f0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
13100 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
13110 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
13120 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
13130 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
13140 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
13150 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
13160 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
13170 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
13180 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
13190 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
131a0 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
131b0 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
131c0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
131d0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
131e0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
131f0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
13200 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
13210 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
13220 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
13230 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
13240 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
13250 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
13260 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
13270 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
13280 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
13290 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
132a0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
132b0 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
132c0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
132d0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
132e0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
132f0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
13300 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
13310 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
13320 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
13330 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
13340 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
13350 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
13360 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
13370 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13380 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
13390 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
133a0 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
133b0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
133c0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
133d0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
133e0 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65   flock() only re
133f0 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43  ally support EXC
13400 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57  LUSIVE locks.  W
13410 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64  e track intermed
13420 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61  iate.** lock sta
13430 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
13440 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
13450 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73  e, but all locks
13460 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62   SHARED or.** ab
13470 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45  ove are really E
13480 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61  XCLUSIVE locks a
13490 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f  nd exclude all o
134a0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66  ther processes f
134b0 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68  rom.** access th
134c0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
134d0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
134e0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
134f0 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
13500 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
13510 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
13520 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
13530 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
13540 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71  int flockLock(sq
13550 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13560 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13570 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13580 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
13590 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
135a0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
135b0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
135c0 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
135d0 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
135e0 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
135f0 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
13600 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
13610 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
13620 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
13630 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
13640 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
13650 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
13660 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
13670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13680 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
13690 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
136a0 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72  ck */.  .  if (r
136b0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
136c0 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
136d0 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20  LOCK_NB)) {.    
136e0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
136f0 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27  no;.    /* didn'
13700 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
13710 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  usy */.    rc = 
13720 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13730 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13740 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
13750 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
13760 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
13770 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
13780 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
13790 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
137a0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
137b0 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
137c0 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
137d0 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ok */.    pFile-
137e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
137f0 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53  leLock;.  }.  OS
13800 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
13810 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29  %d %s %s (flock)
13820 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
13830 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
13840 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
13850 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
13860 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
13870 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  "));.#ifdef SQLI
13880 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13890 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
138a0 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49  ( (rc & SQLITE_I
138b0 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
138c0 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20  IOERR ){.    rc 
138d0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
138e0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
138f0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
13900 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
13910 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13920 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
13930 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13940 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
13950 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
13960 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
13970 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
13980 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
13990 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
139a0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
139b0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
139c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
139d0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
139e0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
139f0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
13a00 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
13a10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
13a20 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
13a30 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
13a40 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
13a50 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
13a60 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13a70 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
13a80 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13a90 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
13aa0 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
13ab0 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63   %d pid=%d (floc
13ac0 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
13ad0 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
13ae0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
13af0 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69  ileLock, osGetpi
13b00 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74  d(0)));.  assert
13b10 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
13b20 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
13b30 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
13b40 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
13b50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
13b60 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
13b70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13b80 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
13b90 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
13ba0 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
13bb0 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
13bc0 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
13bd0 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
13be0 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
13bf0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13c00 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13c10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13c20 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
13c30 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
13c40 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lock. */.  if( r
13c50 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
13c60 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29  e->h, LOCK_UN) )
13c70 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
13c80 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
13c90 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74  K_ERRORS.    ret
13ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
13cb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13cc0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
13cd0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
13ce0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
13cf0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65  ERR_UNLOCK;.  }e
13d00 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
13d10 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
13d20 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
13d30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
13d40 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
13d50 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
13d60 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73  int flockClose(s
13d70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
13d80 20 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21   {.  assert( id!
13d90 3d 30 20 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c  =0 );.  flockUnl
13da0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
13db0 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  ;.  return close
13dc0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
13dd0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13de0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
13df0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
13e00 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  WORK */../******
13e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
13e20 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c  d of the flock l
13e30 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
13e40 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
13e50 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ea0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
13eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f10 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53  ** Begin Named S
13f20 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67  emaphore Locking
13f30 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
13f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
13f50 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
13f60 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
13f70 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57  supported on VxW
13f80 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  orks..**.** Sema
13f90 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
13fa0 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61   like dot-lock a
13fb0 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74  nd flock in that
13fc0 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a   it really only.
13fd0 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c  ** supports EXCL
13fe0 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20  USIVE locking.  
13ff0 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  Only a single pr
14000 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f  ocess can read o
14010 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64  r write.** the d
14020 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
14030 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65  a time.  This re
14040 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20  duces potential 
14050 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74  concurrency, but
14060 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f  .** makes the lo
14070 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14080 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a  n much easier..*
14090 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
140a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
140b0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
140c0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
140d0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
140e0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
140f0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
14100 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
14110 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
14120 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
14130 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
14140 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
14150 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
14160 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
14170 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
14180 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
14190 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
141a0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
141b0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
141c0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
141d0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43  static int semXC
141e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
141f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14200 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
14210 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
14220 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
14230 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
14240 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14250 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14260 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14270 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
14280 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14290 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
142a0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
142b0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
142c0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
142d0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
142e0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
142f0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
14300 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
14310 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
14320 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
14330 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
14340 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
14350 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
14360 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
14370 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d  erved ){.    sem
14380 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
14390 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
143a0 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79  .    if( sem_try
143b0 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
143c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
143d0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
143e0 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20    if( EAGAIN != 
143f0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
14400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
14410 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
14420 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
14430 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
14440 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
14450 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
14460 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
14470 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
14480 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f          /* someo
14490 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20  ne else has the 
144a0 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65  lock when we are
144b0 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20   in NO_LOCK */. 
144c0 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
144d0 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  = (pFile->eFileL
144e0 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43  ock < SHARED_LOC
144f0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
14500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
14510 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74  we could have it
14520 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a   if we want it *
14530 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74  /.      sem_post
14540 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pSem);.    }.  
14550 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
14560 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
14570 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46   %d (sem)\n", pF
14580 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
14590 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73  rved));..  *pRes
145a0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
145b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
145c0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
145d0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
145e0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
145f0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
14600 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
14610 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
14620 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
14630 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
14640 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
14650 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
14660 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
14670 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
14680 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
14690 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
146a0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
146b0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
146c0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
146d0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
146e0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
146f0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
14700 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
14710 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
14720 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
14730 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
14740 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
14750 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
14760 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
14770 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
14780 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
14790 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
147a0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
147b0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
147c0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
147d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
147e0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
147f0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
14800 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
14810 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
14820 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
14830 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
14840 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14850 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
14860 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
14870 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  VE.**.** Semapho
14880 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65  re locks only re
14890 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43  ally support EXC
148a0 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57  LUSIVE locks.  W
148b0 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64  e track intermed
148c0 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61  iate.** lock sta
148d0 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
148e0 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
148f0 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73  e, but all locks
14900 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62   SHARED or.** ab
14910 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45  ove are really E
14920 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61  XCLUSIVE locks a
14930 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f  nd exclude all o
14940 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66  ther processes f
14950 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68  rom.** access th
14960 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
14970 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
14980 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
14990 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
149a0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
149b0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
149c0 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
149d0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
149e0 69 6e 74 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c  int semXLock(sql
149f0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14a00 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
14a10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14a20 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
14a30 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
14a40 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
14a50 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63  ->pSem;.  int rc
14a60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
14a70 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
14a80 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
14a90 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
14aa0 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
14ab0 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
14ac0 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
14ad0 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
14ae0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
14af0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
14b00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14b10 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63  FileLock;.    rc
14b20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14b30 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
14b40 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
14b50 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20   lock semaphore 
14b60 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74  now but bail out
14b70 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f   when already lo
14b80 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73  cked. */.  if( s
14b90 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
14ba0 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==-1 ){.    rc =
14bb0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
14bc0 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
14bd0 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67  ock;.  }..  /* g
14be0 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
14bf0 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
14c00 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
14c10 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
14c20 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c  ock;.. sem_end_l
14c30 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ock:.  return rc
14c40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
14c50 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
14c60 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
14c70 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
14c80 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
14c90 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
14ca0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
14cb0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
14cc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
14cd0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
14ce0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14cf0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
14d00 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
14d10 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
14d20 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
14d30 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
14d40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
14d50 65 6d 58 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  emXUnlock(sqlite
14d60 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14d70 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14d80 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14d90 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14da0 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
14db0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
14dc0 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Sem;..  assert( 
14dd0 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  pFile );.  asser
14de0 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54  t( pSem );.  OST
14df0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
14e00 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
14e10 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
14e20 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
14e30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
14e40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f  le->eFileLock, o
14e50 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
14e60 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
14e70 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
14e80 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
14e90 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
14ea0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
14eb0 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
14ec0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
14ee0 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
14ef0 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
14f00 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
14f10 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
14f20 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
14f30 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
14f40 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
14f50 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
14f60 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
14f70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14f80 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
14f90 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ly unlock. */.  
14fa0 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53  if ( sem_post(pS
14fb0 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  em)==-1 ) {.    
14fc0 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d  int rc, tErrno =
14fd0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
14fe0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
14ff0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
15000 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
15010 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
15020 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
15030 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
15040 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
15050 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
15060 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
15070 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
15080 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
15090 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
150a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
150b0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
150c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
150d0 6d 58 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  mXClose(sqlite3_
150e0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
150f0 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
15100 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
15110 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
15120 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20   semXUnlock(id, 
15130 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73  NO_LOCK);.    as
15140 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15150 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
15160 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
15170 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
15180 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
15190 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73  utex();.    clos
151a0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
151b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
151c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
151d0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
151e0 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  /./*.** Named se
151f0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
15200 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
15210 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  e on VxWorks..**
15220 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15230 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65   End of the name
15240 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
15250 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
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 0a 2f 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 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
15330 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67  egin AFP Locking
15340 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
15350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15360 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20  **.**.** AFP is 
15370 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67  the Apple Filing
15380 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20   Protocol.  AFP 
15390 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c  is a network fil
153a0 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a  esystem found.**
153b0 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74   on Apple Macint
153c0 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20  osh computers - 
153d0 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58  both OS9 and OSX
153e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61  ..**.** Third-pa
153f0 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  rty implementati
15400 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61  ons of AFP are a
15410 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74  vailable.  But t
15420 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  his code here.**
15430 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f   only works on O
15440 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SX..*/..#if defi
15450 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
15460 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
15470 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
15480 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69  .** The afpLocki
15490 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
154a0 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
154b0 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
154c0 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65  ic state.*/.type
154d0 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
154e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
154f0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
15500 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
15510 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74  gContext {.  int
15520 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e   reserved;.  con
15530 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  st char *dbPath;
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15550 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
15560 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72   file */.};..str
15570 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
15580 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  kPB2.{.  unsigne
15590 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
155a0 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  et;        /* of
155b0 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
155c0 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  te to lock */.  
155d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
155e0 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  ng length;      
155f0 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65    /* nbr of byte
15600 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  s to lock */.  u
15610 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15620 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b  g retRangeStart;
15630 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62   /* nbr of 1st b
15640 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75  yte locked if su
15650 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e  ccessful */.  un
15660 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f  signed char unLo
15670 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  ckFlag;         
15680 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30  /* 1 = unlock, 0
15690 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73   = lock */.  uns
156a0 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74  igned char start
156b0 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  EndFlag;       /
156c0 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f  * 1=rel to end o
156d0 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f  f fork, 0=rel to
156e0 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20   start */.  int 
156f0 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15710 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73   file desc to as
15720 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69  soc this lock wi
15730 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  th */.};..#defin
15740 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  e afpfsByteRange
15750 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20  Lock2FSCTL      
15760 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c    _IOWR('z', 23,
15770 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
15780 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a  eLockPB2)../*.**
15790 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
157a0 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f  ty for setting o
157b0 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74  r clearing a bit
157c0 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61  -range lock on a
157d0 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73  n.** AFP filesys
157e0 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75  tem..** .** Retu
157f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
15800 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f  success, SQLITE_
15810 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e  BUSY on failure.
15820 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
15830 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e  fpSetLock(.  con
15840 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
15850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15860 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
15870 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20  to be locked or 
15880 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  unlocked */.  un
15890 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
158b0 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
158c0 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a  ptor on path */.
158d0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
158e0 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20  long offset,    
158f0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74   /* First byte t
15900 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
15910 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
15920 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20  ong length,     
15930 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
15940 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
15950 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  int setLockFlag 
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15970 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f  * True to set lo
15980 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c  ck.  False to cl
15990 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  ear lock */.){. 
159a0 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
159b0 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69  eLockPB2 pb;.  i
159c0 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e  nt err;.  .  pb.
159d0 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74  unLockFlag = set
159e0 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31  LockFlag ? 0 : 1
159f0 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46  ;.  pb.startEndF
15a00 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66  lag = 0;.  pb.of
15a10 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20  fset = offset;. 
15a20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e   pb.length = len
15a30 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20  gth; .  pb.fd = 
15a40 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f  pFile->h;.  .  O
15a50 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
15a60 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25  OCK [%s] for %d%
15a70 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a  s in range %llx:
15a80 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73  %llx\n", .    (s
15a90 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a  etLockFlag?"ON":
15aa0 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68  "OFF"), pFile->h
15ab0 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74  , (pb.fd==-1?"[t
15ac0 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a  estval-1]":""),.
15ad0 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67      offset, leng
15ae0 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  th));.  err = fs
15af0 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
15b00 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
15b10 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
15b20 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
15b30 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
15b40 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
15b50 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
15b60 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69  ("AFPSETLOCK fai
15b70 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
15b80 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  %s' %d %s\n",.  
15b90 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
15ba0 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f   tErrno, strerro
15bb0 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66  r(tErrno)));.#if
15bc0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
15bd0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
15be0 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
15bf0 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
15c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
15c10 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
15c20 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
15c40 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
15c50 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
15c60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
15c70 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
15c80 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
15c90 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
15ca0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15cb0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
15cc0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
15cd0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
15ce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
15cf0 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20  rn rc;.  } else 
15d00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15d10 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
15d20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15d30 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
15d40 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
15d50 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
15d60 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
15d70 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
15d80 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
15d90 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
15da0 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
15db0 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
15dc0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
15dd0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
15de0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
15df0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15e00 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
15e10 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
15e20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
15e30 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
15e40 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
15e50 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b  tic int afpCheck
15e60 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
15e70 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
15e80 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
15e90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15ea0 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
15eb0 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
15ec0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
15ed0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
15ee0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
15ef0 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69  context;.  .  Si
15f00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
15f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
15f20 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
15f30 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
15f40 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15f50 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c   context = (afpL
15f60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
15f70 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
15f80 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f  ontext;.  if( co
15f90 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
15fa0 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
15fb0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
15fc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
15fd0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
15fe0 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
15ff0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
16000 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
16010 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
16020 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
16030 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
16040 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
16050 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
16060 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
16070 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
16080 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
16090 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
160a0 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
160b0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
160c0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
160d0 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
160e0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
160f0 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
16100 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
16110 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
16120 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16130 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
16140 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
16150 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
16160 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
16170 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
16180 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
16190 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
161a0 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
161b0 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
161c0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
161d0 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
161e0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
161f0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16200 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
16210 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
16220 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
16230 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
16240 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
16250 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
16260 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
16270 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
16280 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
16290 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
162a0 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
162b0 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
162c0 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
162d0 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
162e0 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
162f0 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c   %d %d %d (afp)\
16300 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
16310 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
16320 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
16330 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
16340 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
16350 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
16360 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
16370 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
16380 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
16390 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
163a0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
163b0 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
163c0 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
163d0 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
163e0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
163f0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
16400 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
16410 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
16420 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
16430 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
16440 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
16450 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
16460 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
16470 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
16480 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
16490 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
164a0 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
164b0 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
164c0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
164d0 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
164e0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
164f0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
16500 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
16510 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
16520 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
16530 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
16540 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
16550 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
16560 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
16570 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
16580 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
16590 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
165a0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
165b0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
165c0 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
165d0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
165e0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
165f0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
16600 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
16610 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
16620 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
16630 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
16640 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
16650 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
16660 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
16670 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73  ic int afpLock(s
16680 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16690 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
166a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
166b0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
166c0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
166d0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
166e0 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
166f0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
16700 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
16710 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
16720 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
16730 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
16740 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
16750 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
16760 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
16770 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
16780 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
16790 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
167a0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
167b0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
167c0 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
167d0 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
167e0 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
167f0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
16800 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
16810 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
16820 64 20 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  d , osGetpid(0))
16830 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
16840 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
16850 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
16860 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
16870 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
16880 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
16890 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
168a0 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63   the afp_end_loc
168b0 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
168c0 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
168d0 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
168e0 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
168f0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
16900 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
16910 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
16920 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
16930 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
16940 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c   held) (afp)\n",
16950 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
16960 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
16970 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
16980 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16990 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
169a0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
169b0 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
169c0 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28   correct.  **  (
169d0 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
169e0 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
169f0 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
16a00 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
16a10 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
16a20 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
16a30 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
16a40 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
16a50 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
16a60 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
16a70 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
16a80 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
16a90 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
16aa0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
16ab0 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
16ac0 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
16ad0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
16ae0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
16af0 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
16b00 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
16b10 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
16b20 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
16b30 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16b40 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
16b50 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
16b60 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
16b70 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
16b80 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
16b90 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
16ba0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
16bb0 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
16bc0 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
16bd0 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
16be0 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
16bf0 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
16c00 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
16c10 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
16c20 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
16c30 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
16c40 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
16c50 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
16c60 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
16c70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
16c80 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
16c90 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
16ca0 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
16cb0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
16cc0 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
16cd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16ce0 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
16cf0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
16d00 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
16d10 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
16d20 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
16d30 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
16d40 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
16d50 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
16d60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
16d70 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
16d80 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
16d90 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
16da0 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
16db0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
16dc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
16dd0 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
16de0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16df0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
16e00 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
16e10 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
16e20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
16e30 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16e40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
16e50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
16e60 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
16e70 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
16e80 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
16e90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
16ea0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
16eb0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
16ec0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
16ed0 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
16ee0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
16ef0 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
16f00 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
16f10 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
16f20 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
16f30 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
16f40 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
16f50 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
16f60 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
16f70 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
16f80 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
16f90 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
16fa0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
16fb0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
16fc0 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
16fd0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
16fe0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
16ff0 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
17000 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
17010 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
17020 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
17030 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17040 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
17050 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
17060 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
17070 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
17080 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
17090 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
170a0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
170b0 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
170c0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
170d0 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
170e0 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
170f0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
17100 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
17110 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
17120 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
17130 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17140 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
17150 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
17160 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67  no = 0;.    long
17170 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
17180 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
17190 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
171a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
171b0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
171c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
171d0 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
171e0 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
171f0 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
17200 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
17210 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
17220 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
17230 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
17240 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
17250 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
17260 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
17270 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
17280 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
17290 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
172a0 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
172b0 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
172c0 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
172d0 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
172e0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
172f0 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
17300 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
17310 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
17320 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
17330 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
17340 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
17350 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
17360 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
17370 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
17380 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
17390 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
173a0 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
173b0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
173c0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
173d0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
173e0 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
173f0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
17400 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73  rc1) ) {.      s
17410 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
17420 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b  ile, lrc1Errno);
17430 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
17440 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
17450 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
17460 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
17470 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
17480 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
17490 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
174a0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
174b0 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
174c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
174d0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
174e0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
174f0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
17500 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
17510 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
17520 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
17530 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17540 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
17550 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
17560 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
17570 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
17580 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
17590 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
175a0 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
175b0 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
175c0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
175d0 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
175e0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
175f0 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
17600 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
17610 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
17620 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
17630 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
17640 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
17650 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
17660 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
17670 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
17680 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
17690 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
176a0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
176b0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
176c0 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
176d0 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
176e0 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
176f0 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
17700 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
17710 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
17720 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
17730 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
17740 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
17750 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
17760 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
17770 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
17780 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17790 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
177a0 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
177b0 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
177c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
177d0 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
177e0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
177f0 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
17800 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
17810 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
17820 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
17830 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
17840 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
17850 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
17860 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
17870 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
17880 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
17890 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
178a0 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
178b0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
178c0 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
178d0 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
178e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
178f0 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
17900 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17910 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17920 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
17950 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17960 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
17970 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
17980 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
17990 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
179a0 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
179b0 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
179c0 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
179d0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
179e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
179f0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
17a00 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
17a30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
17a40 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
17a50 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
17a60 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17a70 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a90 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
17aa0 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
17ab0 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
17ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
17ad0 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
17ae0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
17af0 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
17b00 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
17b10 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
17b20 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
17b30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17b40 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
17b50 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  d & SQLITE_IOERR
17b60 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
17b70 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17b90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
17ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
17bb0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
17bc0 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
17bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
17be0 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
17bf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17c00 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
17c10 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
17c20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
17c30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17c40 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
17c50 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
17c60 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
17c70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
17c80 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
17c90 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
17ca0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
17cb0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
17cc0 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
17cd0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
17ce0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
17cf0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
17d00 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
17d10 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
17d20 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
17d30 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
17d40 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
17d50 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
17d60 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
17d70 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
17d80 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
17d90 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
17da0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17db0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
17dc0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
17dd0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
17de0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
17df0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
17e00 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
17e10 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
17e20 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
17e30 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
17e40 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
17e50 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
17e60 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
17e70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
17e80 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
17e90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
17ea0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
17eb0 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
17ec0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17ed0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
17ee0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17ef0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
17f00 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
17f10 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
17f20 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
17f30 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
17f40 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
17f50 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
17f60 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
17f70 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
17f80 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
17f90 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
17fa0 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
17fb0 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
17fc0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
17fd0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
17fe0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
17ff0 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
18000 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
18010 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
18020 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
18030 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18040 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
18050 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
18060 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
18070 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
18080 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
18090 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
180a0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
180b0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
180c0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
180d0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
180e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
180f0 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
18100 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
18110 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
18120 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
18130 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
18140 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
18150 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
18160 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
18170 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
18180 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
18190 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69  leLock );.    Si
181a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
181b0 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
181c0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
181d0 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
181e0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
181f0 30 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20  0);.    .#ifdef 
18200 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
18210 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
18220 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
18230 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
18240 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
18250 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
18260 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
18270 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
18280 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
18290 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
182a0 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
182b0 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
182c0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
182d0 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
182e0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
182f0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
18300 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
18310 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
18320 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
18330 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
18340 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
18350 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
18360 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
18370 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
18380 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
18390 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
183a0 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
183b0 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
183c0 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
183d0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
183e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
183f0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
18400 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
18410 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
18420 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
18430 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
18440 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
18450 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
18460 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
18470 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
18480 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18490 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
184a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
184b0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
184c0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
184d0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
184e0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
184f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
18500 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
18510 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18520 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
18530 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
18540 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
18550 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
18560 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
18570 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
18580 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
18590 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
185a0 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
185b0 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
185c0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
185d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
185e0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
185f0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
18600 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
18610 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
18620 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
18630 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
18640 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
18650 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
18660 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
18670 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18680 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18690 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
186a0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
186b0 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
186c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
186d0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
186e0 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
186f0 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
18700 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
18710 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18720 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18730 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
18740 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
18750 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
18760 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
18770 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
18780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18790 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
187a0 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
187b0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
187c0 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
187d0 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
187e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
187f0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
18800 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
18810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18820 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
18830 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
18840 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
18850 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
18860 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
18870 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
18880 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
18890 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
188a0 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
188b0 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
188c0 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
188d0 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
188e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
188f0 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
18900 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
18910 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
18920 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
18930 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
18940 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
18950 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
18960 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18970 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
18980 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18990 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
189a0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
189b0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
189c0 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
189d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
189e0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
189f0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18a00 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
18a10 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
18a20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
18a30 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
18a40 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
18a50 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
18a60 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18a70 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
18a80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18aa0 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
18ab0 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
18ac0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
18ad0 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
18ae0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
18af0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
18b00 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
18b10 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
18b20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
18b30 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
18b40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18b50 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
18b60 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
18b70 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
18b80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
18b90 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61  se a file & clea
18ba0 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63  nup AFP specific
18bb0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
18bc0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
18bd0 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  afpClose(sqlite3
18be0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
18bf0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18c00 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
18c10 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18c20 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
18c30 69 64 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e  id!=0 );.  afpUn
18c40 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
18c50 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
18c60 74 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69  tex();.  if( pFi
18c70 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
18c80 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
18c90 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
18ca0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
18cb0 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
18cc0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
18cd0 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
18ce0 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
18cf0 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
18d00 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
18d10 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
18d20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
18d30 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
18d40 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  node->aPending. 
18d50 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
18d60 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
18d70 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   when.    ** the
18d80 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
18d90 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
18da0 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
18db0 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
18dc0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
18dd0 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
18de0 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
18df0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72  ingContext);.  r
18e00 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
18e10 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
18e20 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
18e30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
18e40 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
18e50 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
18e60 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18e70 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
18e80 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
18e90 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  s the AFP lock i
18ea0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
18eb0 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
18ec0 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
18ed0 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
18ee0 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
18ef0 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
18f00 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
18f10 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49  is available.  I
18f20 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70  f you don't comp
18f30 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74  ile for a mac, t
18f40 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66  hen the "unix-af
18f50 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74  p".** VFS is not
18f60 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
18f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f80 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
18f90 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
18fa0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
18fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
19010 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
19020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
19060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
19080 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n NFS Locking **
19090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
190b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
190c0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
190d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
190e0 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f  _STYLE./*. ** Lo
190f0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
19100 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
19110 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
19120 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
19130 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74  ileLock. ** must
19140 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
19150 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
19160 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68  K.. **. ** If th
19170 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
19180 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
19190 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
191a0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a  y at or below. *
191b0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
191c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
191d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
191e0 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74   no-op.. */.stat
191f0 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b  ic int nfsUnlock
19200 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19210 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
19220 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  ){.  return posi
19230 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
19240 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65  eLock, 1);.}..#e
19250 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
19260 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
19270 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
19280 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
19290 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
192a0 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63  e is the NFS loc
192b0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
192c0 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
192d0 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
192e0 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
192f0 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
19300 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
19310 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
19320 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
19330 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    .**.**********
19340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
19350 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  of the NFS lock 
19360 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
19370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19380 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
19390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193d0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
193e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19420 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
19430 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b  ******* Non-lock
19440 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ing sqlite3_file
19450 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
19460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19470 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
19480 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63   next division c
19490 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e  ontains implemen
194a0 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  tations for all 
194b0 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a  methods of the .
194c0 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
194d0 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61  object other tha
194e0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  n the locking me
194f0 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b  thods.  The lock
19500 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77  ing.** methods w
19510 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64  ere defined in d
19520 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28  ivisions above (
19530 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  one locking meth
19540 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69  od per.** divisi
19550 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68  on).  Those meth
19560 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ods that are com
19570 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
19580 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20  ng modes.** are 
19590 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20  gather together 
195a0 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69  into this divisi
195b0 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  on..*/../*.** Se
195c0 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
195d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
195e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
195f0 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a  then read cnt .*
19600 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  * bytes into pBu
19610 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  f. Return the nu
19620 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
19630 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a  tually read..**.
19640 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64  ** NB:  If you d
19650 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20  efine USE_PREAD 
19660 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20  or USE_PREAD64, 
19670 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c  then it might al
19680 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  so.** be necessa
19690 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  ry to define _XO
196a0 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65  PEN_SOURCE to be
196b0 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69   500.  This vari
196c0 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73  es from.** one s
196d0 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72  ystem to another
196e0 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20  .  Since SQLite 
196f0 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20  does not define 
19700 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20  USE_PREAD.** in 
19710 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61  any form by defa
19720 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74  ult, we will not
19730 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69   attempt to defi
19740 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
19750 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73  ..** See tickets
19760 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31   #2741 and #2681
19770 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
19780 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
19790 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
197a0 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c  ailed read the l
197b0 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
197c0 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
197d0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
197e0 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
197f0 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
19800 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
19810 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
19820 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
19830 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20   int got;.  int 
19840 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28  prior = 0;.#if (
19850 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
19860 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
19870 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
19880 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
19890 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
198a0 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ART;.  assert( c
198b0 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66  nt==(cnt&0x1ffff
198c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
198d0 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a  d->h>2 );.  do{.
198e0 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
198f0 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d  PREAD).    got =
19900 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20   osPread(id->h, 
19910 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
19920 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
19930 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
19940 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
19950 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
19960 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
19970 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
19980 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
19990 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
199a0 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
199b0 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66  #else.    newOff
199c0 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
199d0 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
199e0 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
199f0 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
19a00 66 73 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20  fset = -1 );.   
19a10 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30   if( newOffset<0
19a20 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
19a30 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
19a40 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a  le*)id, errno);.
19a50 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
19a60 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d  .    }.    got =
19a70 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70   osRead(id->h, p
19a80 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69  Buf, cnt);.#endi
19a90 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63  f.    if( got==c
19aa0 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nt ) break;.    
19ab0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
19ac0 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49     if( errno==EI
19ad0 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20  NTR ){ got = 1; 
19ae0 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20  continue; }.    
19af0 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20    prior = 0;.   
19b00 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
19b10 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  o((unixFile*)id,
19b20 20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20    errno);.      
19b30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
19b40 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20   if( got>0 ){.  
19b50 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a      cnt -= got;.
19b60 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
19b70 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  got;.      prior
19b80 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
19b90 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f  Buf = (void*)(go
19ba0 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29  t + (char*)pBuf)
19bb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
19bc0 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d  ( got>0 );.  TIM
19bd0 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43  ER_END;.  OSTRAC
19be0 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E(("READ    %-3d
19bf0 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
19c00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
19c10 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72  id->h, got+prior
19c20 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20  , offset-prior, 
19c30 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
19c40 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72  .  return got+pr
19c50 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ior;.}../*.** Re
19c60 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
19c70 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
19c80 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
19c90 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
19ca0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
19cb0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
19cc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
19cd0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
19ce0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
19cf0 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
19d00 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
19d10 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
19d20 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
19d30 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
19d40 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46  ffset.){.  unixF
19d50 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
19d60 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
19d70 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
19d80 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
19d90 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20  ( offset>=0 );. 
19da0 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
19db0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
19dc0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
19dd0 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
19de0 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
19df0 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
19e00 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
19e10 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
19e20 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
19e30 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
19e40 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
19e50 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
19e60 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
19e70 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
19e80 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
19e90 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
19ea0 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
19eb0 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
19ec0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
19ed0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
19ee0 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
19ef0 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72 65   of this read re
19f00 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
19f10 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
19f20 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
19f30 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
19f40 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
19f50 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
19f60 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
19f70 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
19f80 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
19f90 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
19fa0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
19fb0 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
19fc0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
19fd0 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20  offset], amt);. 
19fe0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19ff0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1a000 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  {.      int nCop
1a010 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  y = pFile->mmapS
1a020 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
1a030 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1a040 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
1a050 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1a060 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20  fset], nCopy);. 
1a070 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
1a080 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
1a090 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
1a0a0 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
1a0b0 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
1a0c0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1a0d0 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
1a0e0 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  ad(pFile, offset
1a0f0 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
1a100 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
1a110 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a120 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
1a130 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f  ( got<0 ){.    /
1a140 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
1a150 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
1a160 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1a170 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
1a180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f    }else{.    sto
1a190 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1a1a0 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20  e, 0);   /* not 
1a1b0 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1a1c0 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
1a1d0 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
1a1e0 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
1a1f0 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
1a200 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
1a210 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
1a220 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
1a230 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a240 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
1a250 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1a260 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c   to seek the fil
1a270 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61 73  e-descriptor pas
1a280 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1a290 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20   argument to.** 
1a2a0 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20  absolute offset 
1a2b0 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d  iOff, then attem
1a2c0 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66  pt to write nBuf
1a2d0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
1a2e0 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69  rom.** pBuf to i
1a2f0 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
1a300 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31  ccurs, return -1
1a310 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e   and set *piErrn
1a320 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  o. Otherwise, .*
1a330 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63 74  * return the act
1a340 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ual number of by
1a350 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68 69  tes written (whi
1a360 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74  ch may be less t
1a370 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f  han.** nBuf)..*/
1a380 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1a390 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e  AndWriteFd(.  in
1a3a0 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20  t fd,           
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a3c0 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1a3d0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1a3e0 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20    i64 iOff,     
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a400 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74    /* File offset
1a410 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
1a420 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  g at */.  const 
1a430 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
1a440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
1a450 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  y data from this
1a460 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20 66   buffer to the f
1a470 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75  ile */.  int nBu
1a480 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1a490 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1a4a0 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66 20   of buffer pBuf 
1a4b0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
1a4c0 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20  t *piErrno      
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a4e0 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62   OUT: Error numb
1a4f0 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75  er if error occu
1a500 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  rs */.){.  int r
1a510 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1a520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1a530 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a540 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a  system call */..
1a550 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d    assert( nBuf==
1a560 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20 29  (nBuf&0x1ffff) )
1a570 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 32  ;.  assert( fd>2
1a580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 69   );.  assert( pi
1a590 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e 42  Errno!=0 );.  nB
1a5a0 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20  uf &= 0x1ffff;. 
1a5b0 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23   TIMER_START;..#
1a5c0 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1a5d0 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d  READ).  do{ rc =
1a5e0 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 28 66   (int)osPwrite(f
1a5f0 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69  d, pBuf, nBuf, i
1a600 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  Off); }while( rc
1a610 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1a620 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  TR );.#elif defi
1a630 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
1a640 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74  .  do{ rc = (int
1a650 29 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c 20  )osPwrite64(fd, 
1a660 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66  pBuf, nBuf, iOff
1a670 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  );}while( rc<0 &
1a680 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b  & errno==EINTR);
1a690 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20  .#else.  do{.   
1a6a0 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65   i64 iSeek = lse
1a6b0 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45  ek(fd, iOff, SEE
1a6c0 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75  K_SET);.    Simu
1a6d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65  lateIOError( iSe
1a6e0 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69  ek = -1 );.    i
1a6f0 66 28 20 69 53 65 65 6b 3c 30 20 29 7b 0a 20 20  f( iSeek<0 ){.  
1a700 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1a710 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a720 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69 74 65      rc = osWrite
1a730 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 29  (fd, pBuf, nBuf)
1a740 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  ;.  }while( rc<0
1a750 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1a760 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49   );.#endif..  TI
1a770 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41  MER_END;.  OSTRA
1a780 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE(("WRITE   %-3
1a790 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
1a7a0 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66  \n", fd, rc, iOf
1a7b0 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  f, TIMER_ELAPSED
1a7c0 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30 20  ));..  if( rc<0 
1a7d0 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72 72  ) *piErrno = err
1a7e0 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  no;.  return rc;
1a7f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .}.../*.** Seek 
1a800 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
1a810 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
1a820 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
1a830 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
1a840 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1a850 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1a860 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
1a870 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
1a880 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
1a890 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
1a8a0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
1a8b0 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
1a8c0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1a8d0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1a8e0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1a8f0 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
1a900 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
1a910 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
1a920 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
1a930 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e 20   cnt){.  return 
1a940 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 69  seekAndWriteFd(i
1a950 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70 42  d->h, offset, pB
1a960 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61  uf, cnt, &id->la
1a970 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a  stErrno);.}.../*
1a980 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
1a990 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
1a9a0 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
1a9b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1a9c0 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
1a9d0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
1a9e0 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
1a9f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1aa00 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
1aa10 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
1aa20 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1aa30 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1aa40 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1aa50 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
1aa60 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1aa70 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
1aa80 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
1aa90 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
1aaa0 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
1aab0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1aac0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1aad0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
1aae0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
1aaf0 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
1ab00 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
1ab10 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
1ab20 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
1ab30 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1ab40 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
1ab50 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
1ab60 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
1ab70 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
1ab80 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
1ab90 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
1aba0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
1abb0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   );.#endif..#ifd
1abc0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1abd0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1abe0 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1abf0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1ac00 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1ac10 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
1ac20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1ac30 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1ac40 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1ac50 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
1ac60 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1ac70 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
1ac80 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
1ac90 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
1aca0 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
1acb0 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
1acc0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
1acd0 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
1ace0 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
1acf0 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
1ad00 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1ad10 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  rite ){.    pFil
1ad20 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b  e->dbUpdate = 1;
1ad30 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1ad40 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
1ad50 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ied */.    if( o
1ad60 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66  ffset<=24 && off
1ad70 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20  set+amt>=27 ){. 
1ad80 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1ad90 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b     char oldCntr[
1ada0 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4];.      Simula
1adb0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1adc0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
1add0 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
1ade0 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34  , 24, oldCntr, 4
1adf0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1ae00 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1ae10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1ae20 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64  =4 || memcmp(old
1ae30 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70  Cntr, &((char*)p
1ae40 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c  Buf)[24-offset],
1ae50 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)!=0 ){.      
1ae60 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1ae70 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20  trChng = 1;  /* 
1ae80 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1ae90 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e  counter has chan
1aea0 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ged */.      }. 
1aeb0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1aec0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1aed0 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49  ITE_MMAP_READWRI
1aee0 54 45 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41  TE) && SQLITE_MA
1aef0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1af00 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
1af10 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72 69  much of this wri
1af20 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  te request as po
1af30 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
1af40 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
1af50 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
1af60 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
1af70 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
1af80 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
1af90 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1afa0 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
1afb0 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1afc0 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
1afd0 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
1afe0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
1aff0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d  ffset], pBuf, am
1b000 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1b010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1b030 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e   nCopy = pFile->
1b040 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65  mmapSize - offse
1b050 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  t;.      memcpy(
1b060 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1b070 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1b080 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70  set], pBuf, nCop
1b090 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
1b0a0 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
1b0b0 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
1b0c0 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
1b0d0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
1b0e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1b0f0 69 66 0a 20 0a 20 20 77 68 69 6c 65 28 20 28 77  if. .  while( (w
1b100 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rote = seekAndWr
1b110 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ite(pFile, offse
1b120 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3c 61  t, pBuf, amt))<a
1b130 6d 74 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b  mt && wrote>0 ){
1b140 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
1b150 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
1b160 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
1b170 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
1b180 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
1b190 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1b1a0 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
1b1b0 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
1b1c0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1b1d0 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
1b1e0 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e   ));..  if( amt>
1b1f0 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28  wrote ){.    if(
1b200 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c   wrote<0 && pFil
1b210 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e  e->lastErrno!=EN
1b220 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OSPC ){.      /*
1b230 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
1b240 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a  y seekAndWrite *
1b250 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1b260 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
1b270 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
1b280 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1b290 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a  no(pFile, 0); /*
1b2a0 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
1b2b0 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ror */.      ret
1b2c0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
1b2d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1b2e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b2f0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1b300 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
1b310 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1b320 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
1b330 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
1b340 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
1b350 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
1b360 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
1b370 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74  e occurring at t
1b380 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
1b390 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1b3a0 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
1b3b0 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
1b3c0 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
1b3d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  endif../*.** We 
1b3e0 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73  do not trust sys
1b3f0 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20  tems to provide 
1b400 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73  a working fdatas
1b410 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e  ync().  Some do.
1b420 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f  .** Others do no
1b430 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77  .  To be safe, w
1b440 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74  e will stick wit
1b450 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20  h the (slightly 
1b460 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63  slower).** fsync
1b470 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20  (). If you know 
1b480 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d  that your system
1b490 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64   does support fd
1b4a0 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63  atasync() correc
1b4b0 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d  tly,.** then sim
1b4c0 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68  ply compile with
1b4d0 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61   -Dfdatasync=fda
1b4e0 74 61 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45  tasync or -DHAVE
1b4f0 5f 46 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69  _FDATASYNC.*/.#i
1b500 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74 61  f !defined(fdata
1b510 73 79 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46  sync) && !HAVE_F
1b520 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e  DATASYNC.# defin
1b530 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e  e fdatasync fsyn
1b540 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  c.#endif../*.** 
1b550 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  Define HAVE_FULL
1b560 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20  FSYNC to 0 or 1 
1b570 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
1b580 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
1b590 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d  he F_FULLFSYNC m
1b5a0 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e  acro is defined.
1b5b0 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73    F_FULLFSYNC is
1b5c0 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e   currently.** on
1b5d0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
1b5e0 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74  Mac OS X.  But t
1b5f0 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65  hat could change
1b600 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55  ..*/.#ifdef F_FU
1b610 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  LLFSYNC.# define
1b620 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1b630 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  1.#else.# define
1b640 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1b650 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
1b660 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
1b670 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
1b680 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
1b690 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
1b6a0 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
1b6b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
1b6c0 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
1b6d0 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
1b6e0 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
1b6f0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1b700 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
1b710 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
1b720 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
1b730 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
1b740 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
1b750 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
1b760 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
1b770 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
1b780 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
1b790 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
1b7a0 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
1b7b0 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
1b7c0 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
1b7d0 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
1b7e0 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
1b7f0 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
1b800 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
1b810 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
1b820 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
1b830 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  e file..**.** SQ
1b840 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61  Lite sets the da
1b850 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74  taOnly flag if t
1b860 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1b870 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ile is unchanged
1b880 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65  ..** The idea be
1b890 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73  hind dataOnly is
1b8a0 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
1b8b0 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66  only write the f
1b8c0 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74  ile content.** t
1b8d0 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20  o disk, not the 
1b8e0 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20  inode.  We only 
1b8f0 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20  set dataOnly if 
1b900 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
1b910 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73   .** unchanged s
1b920 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69  ince the file si
1b930 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ze is part of th
1b940 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65  e inode.  Howeve
1b950 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20  r, .** Ted Ts'o 
1b960 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64  tells us that fd
1b970 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61  atasync() will a
1b980 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e  lso write the in
1b990 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69  ode if the.** fi
1b9a0 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e  le size has chan
1b9b0 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72  ged.  The only r
1b9c0 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62  eal difference b
1b9d0 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63  etween fdatasync
1b9e0 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28  ().** and fsync(
1b9f0 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c  ), Ted tells us,
1ba00 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79   is that fdatasy
1ba10 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c  nc() will not fl
1ba20 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65  ush the.** inode
1ba30 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72   if the mtime or
1ba40 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20   owner or other 
1ba50 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73  inode attributes
1ba60 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a   have changed..*
1ba70 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61  * We only care a
1ba80 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69  bout the file si
1ba90 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65  ze, not the othe
1baa0 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65  r file attribute
1bab0 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20  s, so.** as far 
1bac0 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e  as SQLite is con
1bad0 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61  cerned, an fdata
1bae0 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73  sync() is always
1baf0 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f   adequate..** So
1bb00 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
1bb10 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69  fdatasync() if i
1bb20 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  t is available, 
1bb30 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a  regardless of.**
1bb40 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1bb50 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e  e dataOnly flag.
1bb60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1bb70 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64  ull_fsync(int fd
1bb80 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20  , int fullSync, 
1bb90 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20  int dataOnly){. 
1bba0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
1bbb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66  he following "if
1bbc0 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20  def/elif/else/" 
1bbd0 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61  block has the sa
1bbe0 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a  me structure as.
1bbf0 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c    ** the one bel
1bc00 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63  ow. It is replic
1bc10 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79  ated here solely
1bc20 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65   to avoid clutte
1bc30 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68  ring .  ** up th
1bc40 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68  e real code with
1bc50 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41   the UNUSED_PARA
1bc60 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a  METER() macros..
1bc70 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1bc80 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55  TE_NO_SYNC.  UNU
1bc90 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1bca0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1bcb0 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
1bcc0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1bcd0 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1bce0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1bcf0 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1bd00 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1bd10 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
1bd20 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
1bd30 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
1bd40 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1bd50 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  y);.#endif..  /*
1bd60 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
1bd70 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
1bd80 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   we do a normal 
1bd90 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a  fsync() and .  *
1bda0 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69  * FULLSYNC.  Thi
1bdb0 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
1bdc0 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69   testing to veri
1bdd0 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  fy that this pro
1bde0 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73  cedure.  ** gets
1bdf0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
1be00 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e   correct argumen
1be10 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ts..  */.#ifdef 
1be20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
1be30 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c  ( fullSync ) sql
1be40 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
1be50 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
1be60 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
1be70 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
1be80 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
1be90 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
1bea0 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
1beb0 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
1bec0 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 67 6f 20 61  no-op.  But go a
1bed0 68 65 61 64 20 61 6e 64 20 63 61 6c 6c 20 66 73  head and call fs
1bee0 74 61 74 28 29 20 74 6f 20 76 61 6c 69 64 61 74  tat() to validat
1bef0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
1bf00 64 65 73 63 72 69 70 74 6f 72 20 61 73 20 77 65  descriptor as we
1bf10 20 6e 65 65 64 20 61 20 6d 65 74 68 6f 64 20 74   need a method t
1bf20 6f 20 70 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c  o provoke a fail
1bf30 75 72 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  ure during.  ** 
1bf40 63 6f 76 65 72 61 74 65 20 74 65 73 74 69 6e 67  coverate testing
1bf50 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1bf60 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b  LITE_NO_SYNC.  {
1bf70 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1bf80 20 62 75 66 3b 0a 20 20 20 20 72 63 20 3d 20 6f   buf;.    rc = o
1bf90 73 46 73 74 61 74 28 66 64 2c 20 26 62 75 66 29  sFstat(fd, &buf)
1bfa0 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 48 41 56 45  ;.  }.#elif HAVE
1bfb0 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
1bfc0 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20   fullSync ){.   
1bfd0 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64   rc = osFcntl(fd
1bfe0 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
1bff0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c000 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
1c010 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
1c020 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
1c030 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
1c040 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
1c050 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20  ** It shouldn't 
1c060 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
1c070 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
1c080 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
1c090 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d    ** file system
1c0a0 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
1c0b0 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
1c0c0 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
1c0d0 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72   ** isn't suppor
1c0e0 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
1c0f0 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
1c100 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
1c110 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f    ** and (for no
1c120 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
1c130 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
1c140 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
1c150 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20  ll.  .  ** It'd 
1c160 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
1c170 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
1c180 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
1c190 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66  void .  ** the f
1c1a0 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
1c1b0 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
1c1c0 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
1c1d0 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
1c1e0 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69  fd);..#elif defi
1c1f0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1c200 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20   /* fdatasync() 
1c210 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20  on HFS+ doesn't 
1c220 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69  yet flush the fi
1c230 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68  le size if it ch
1c240 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  anged correctly.
1c250 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c    ** so currentl
1c260 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20  y we default to 
1c270 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72  the macro that r
1c280 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79  edefines fdatasy
1c290 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f  nc to fsync.  */
1c2a0 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64  .  rc = fsync(fd
1c2b0 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d  );.#else .  rc =
1c2c0 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
1c2d0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1c2e0 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65   if( rc==-1 && e
1c2f0 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b  rrno==ENOTSUP ){
1c300 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
1c310 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
1c320 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1c330 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
1c340 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1c350 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1c360 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53  YNC */..  if( OS
1c370 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d  _VXWORKS && rc!=
1c380 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   -1 ){.    rc = 
1c390 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1c3a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1c3b0 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
1c3c0 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
1c3d0 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1c3e0 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
1c3f0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1c400 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
1c410 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
1c420 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
1c430 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1c440 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1c450 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
1c460 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
1c470 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
1c480 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
1c490 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
1c4a0 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
1c4b0 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
1c4c0 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72  .** The director
1c4d0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1c4e0 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e  r is used for on
1c4f0 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74  ly one thing - t
1c500 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64  o.** fsync() a d
1c510 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65  irectory to make
1c520 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74   sure file creat
1c530 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ion and deletion
1c540 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66   events.** are f
1c550 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20  lushed to disk. 
1c560 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65   Such fsyncs are
1c570 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e   not needed on n
1c580 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69  ewer.** journali
1c590 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20  ng filesystems, 
1c5a0 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64  but are required
1c5b0 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79   on older filesy
1c5c0 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
1c5d0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1c5e0 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e   overridden usin
1c5f0 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c  g the xSetSysCal
1c600 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20  l interface..** 
1c610 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  The ability to o
1c620 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75  verride this rou
1c630 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69  tine was added i
1c640 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65  n support of the
1c650 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  .** chromium san
1c660 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61  dbox.  Opening a
1c670 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20   directory is a 
1c680 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77  security risk (w
1c690 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73  e are.** told) s
1c6a0 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72  o making it over
1c6b0 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20  rideable allows 
1c6c0 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  the chromium san
1c6d0 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61  dbox to.** repla
1c6e0 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1c6f0 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20  with a harmless 
1c700 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20  no-op.  To make 
1c710 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1c720 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65  a no-op, replace
1c730 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20   it with a stub 
1c740 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c  that returns SQL
1c750 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1c760 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f  s.** *pFd set to
1c770 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
1c780 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  er..**.** If SQL
1c790 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c7a0 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
1c7b0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1c7c0 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
1c7d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c7e0 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
1c7f0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1c800 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
1c810 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1c820 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
1c830 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
1c840 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68  nt fd = -1;.  ch
1c850 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f  ar zDirname[MAX_
1c860 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20  PATHNAME+1];..  
1c870 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1c880 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1c890 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  Dirname, "%s", z
1c8a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Filename);.  for
1c8b0 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28  (ii=(int)strlen(
1c8c0 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 30 20  zDirname); ii>0 
1c8d0 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21  && zDirname[ii]!
1c8e0 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69  ='/'; ii--);.  i
1c8f0 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a  f( ii>0 ){.    z
1c900 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c  Dirname[ii] = '\
1c910 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0';.  }else{.   
1c920 20 69 66 28 20 7a 44 69 72 6e 61 6d 65 5b 30 5d   if( zDirname[0]
1c930 21 3d 27 2f 27 20 29 20 7a 44 69 72 6e 61 6d 65  !='/' ) zDirname
1c940 5b 30 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7a  [0] = '.';.    z
1c950 44 69 72 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a  Dirname[1] = 0;.
1c960 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f 62 75 73    }.  fd = robus
1c970 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  t_open(zDirname,
1c980 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
1c990 52 59 2c 20 30 29 3b 0a 20 20 69 66 28 20 66 64  RY, 0);.  if( fd
1c9a0 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  >=0 ){.    OSTRA
1c9b0 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE(("OPENDIR %-3
1c9c0 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  d %s\n", fd, zDi
1c9d0 72 6e 61 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 2a  rname));.  }.  *
1c9e0 70 46 64 20 3d 20 66 64 3b 0a 20 20 69 66 28 20  pFd = fd;.  if( 
1c9f0 66 64 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 53  fd>=0 ) return S
1ca00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75  QLITE_OK;.  retu
1ca10 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1ca20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1ca30 42 4b 50 54 2c 20 22 6f 70 65 6e 44 69 72 65 63  BKPT, "openDirec
1ca40 74 6f 72 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29  tory", zDirname)
1ca50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1ca60 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
1ca70 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
1ca80 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
1ca90 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1caa0 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
1cab0 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
1cac0 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
1cad0 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
1cae0 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
1caf0 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
1cb00 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
1cb10 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
1cb20 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
1cb30 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
1cb40 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
1cb50 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
1cb60 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
1cb70 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1cb80 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
1cb90 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
1cba0 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
1cbb0 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
1cbc0 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
1cbd0 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
1cbe0 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
1cbf0 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
1cc00 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
1cc10 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
1cc20 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
1cc30 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
1cc40 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
1cc50 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
1cc60 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
1cc70 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
1cc80 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
1cc90 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
1cca0 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
1ccb0 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1ccc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1ccd0 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
1cce0 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
1ccf0 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
1cd00 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
1cd10 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
1cd20 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1cd30 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1cd40 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74  t unixSync(sqlit
1cd50 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1cd60 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
1cd70 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
1cd80 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1cd90 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44  *)id;..  int isD
1cda0 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73  ataOnly = (flags
1cdb0 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  &SQLITE_SYNC_DAT
1cdc0 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  AONLY);.  int is
1cdd0 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67  Fullsync = (flag
1cde0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1cdf0 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a  SYNC_FULL;..  /*
1ce00 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
1ce10 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
1ce20 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
1ce30 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
1ce40 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
1ce50 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
1ce60 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
1ce70 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1ce80 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
1ce90 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
1cea0 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
1ceb0 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
1cec0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
1ced0 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
1cee0 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
1cef0 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
1cf00 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1cf10 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
1cf20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
1cf30 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
1cf40 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
1cf50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
1cf60 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1cf70 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
1cf80 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1cf90 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63   rc = full_fsync
1cfa0 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c  (pFile->h, isFul
1cfb0 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c  lsync, isDataOnl
1cfc0 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  y);.  SimulateIO
1cfd0 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1cfe0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
1cff0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1d000 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
1d010 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1d020 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1d030 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1d040 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1d050 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ath);.  }..  /* 
1d060 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64  Also fsync the d
1d070 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1d080 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20  ing the file if 
1d090 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67  the DIRSYNC flag
1d0a0 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54  .  ** is set.  T
1d0b0 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d  his is a one-tim
1d0c0 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d  e occurrence.  M
1d0d0 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61  any systems (exa
1d0e0 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a  mples: AIX).  **
1d0f0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66   are unable to f
1d100 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79  sync a directory
1d110 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f  , so ignore erro
1d120 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e  rs on the fsync.
1d130 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1d140 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1d150 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
1d160 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64  ){.    int dirfd
1d170 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
1d180 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65  DIRSYNC %s (have
1d190 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
1d1a0 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
1d1b0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20  File->zPath,.   
1d1c0 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
1d1d0 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
1d1e0 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync));.    rc = 
1d1f0 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
1d200 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64  pFile->zPath, &d
1d210 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
1d220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d230 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63        full_fsync
1d240 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20  (dirfd, 0, 0);. 
1d250 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
1d260 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20  e(pFile, dirfd, 
1d270 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
1d280 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1d290 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  rt( rc==SQLITE_C
1d2a0 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ANTOPEN );.     
1d2b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d2c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1d2d0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1d2e0 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1d2f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1d300 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
1d310 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
1d320 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
1d330 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
1d340 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
1d350 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1d360 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
1d370 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1d380 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1d390 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  d;.  int rc;.  a
1d3a0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1d3b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1d3c0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1d3d0 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20  _IOERR_TRUNCATE 
1d3e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1d3f0 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
1d400 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
1d410 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1d420 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
1d430 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
1d440 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
1d450 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
1d460 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
1d470 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
1d480 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
1d490 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
1d4a0 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
1d4b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
1d4c0 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
1d4d0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1d4e0 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
1d4f0 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
1d500 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
1d510 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
1d520 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1d530 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
1d540 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
1d550 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  te(pFile->h, nBy
1d560 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  te);.  if( rc ){
1d570 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1d580 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
1d590 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
1d5a0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1d5b0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1d5c0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
1d5d0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1d5e0 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
1d5f0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1d600 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1d610 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1d620 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1d630 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1d640 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  to.    ** doing 
1d650 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1d660 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
1d670 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
1d680 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20  ther than a.    
1d690 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
1d6a0 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20  se file) and we 
1d6b0 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1d6c0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1d6d0 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66  ,.    ** that ef
1d6e0 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65  fectively update
1d6f0 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  s the change cou
1d700 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  nter.  This migh
1d710 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20  t happen.    ** 
1d720 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61  when restoring a
1d730 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
1d740 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66  the backup API f
1d750 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  rom a zero-lengt
1d760 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e  h.    ** source.
1d770 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d780 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1d790 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30  rite && nByte==0
1d7a0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1d7b0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1d7c0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
1d7d0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
1d7e0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
1d7f0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1d800 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74  was just truncat
1d810 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61  ed to a size sma
1d820 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ller than the cu
1d830 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d  rrently.    ** m
1d840 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65  apped region, re
1d850 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
1d860 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ve mapping size 
1d870 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20  as well. SQLite 
1d880 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20  will.    ** use 
1d890 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65  read() and write
1d8a0 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  () to access dat
1d8b0 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f  a beyond this po
1d8c0 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e  int from now on.
1d8d0 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66    .    */.    if
1d8e0 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d  ( nByte<pFile->m
1d8f0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1d900 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1d910 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = nByte;.    }.
1d920 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
1d930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d940 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
1d950 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
1d960 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
1d970 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
1d980 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
1d990 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1d9a0 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
1d9b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1d9c0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
1d9d0 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1d9e0 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28    rc = osFstat((
1d9f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1da00 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75  h, &buf);.  Simu
1da10 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1da20 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  1 );.  if( rc!=0
1da30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
1da40 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1da50 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
1da60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1da70 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
1da80 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
1da90 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57  st_size;..  /* W
1daa0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65  hen opening a ze
1dab0 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65  ro-size database
1dac0 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49  , the findInodeI
1dad0 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
1dae0 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
1daf0 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
1db00 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
1db10 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
1db20 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
1db30 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
1db40 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
1db50 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
1db60 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
1db70 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
1db80 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
1db90 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
1dba0 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
1dbb0 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
1dbc0 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
1dbd0 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
1dbe0 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
1dbf0 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
1dc00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1dc10 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
1dc20 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1dc30 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1dc40 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
1dc50 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
1dc60 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
1dc70 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
1dc80 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
1dc90 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
1dca0 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
1dcb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dcc0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1dcd0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
1dce0 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
1dcf0 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  f../* .** This f
1dd00 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1dd10 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
1dd20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1dd30 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d  E_HINT .** file-
1dd40 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f  control operatio
1dd50 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20  n.  Enlarge the 
1dd60 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74  database to nByt
1dd70 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72  es in size.** (r
1dd80 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
1dd90 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65   next chunk-size
1dda0 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  ).  If the datab
1ddb0 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  ase is already.*
1ddc0 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67  * nBytes or larg
1ddd0 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  er, this routine
1dde0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1ddf0 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c  static int fcntl
1de00 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c  SizeHint(unixFil
1de10 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42  e *pFile, i64 nB
1de20 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c  yte){.  if( pFil
1de30 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1de40 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20      i64 nSize;  
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69    /* Required fi
1de70 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
1de80 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20  truct stat buf; 
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dea0 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74  Used to hold ret
1deb0 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73  urn values of fs
1dec0 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20  tat() */.   .   
1ded0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69   if( osFstat(pFi
1dee0 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a  le->h, &buf) ){.
1def0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1df00 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1df10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a  .    }..    nSiz
1df20 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c  e = ((nByte+pFil
1df30 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20  e->szChunk-1) / 
1df40 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
1df50 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
1df60 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e  ;.    if( nSize>
1df70 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65  (i64)buf.st_size
1df80 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   ){..#if defined
1df90 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c  (HAVE_POSIX_FALL
1dfa0 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50  OCATE) && HAVE_P
1dfb0 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20  OSIX_FALLOCATE. 
1dfc0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
1dfd0 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69   below is handli
1dfe0 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ng the return va
1dff0 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61  lue of osFalloca
1e000 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63  te() .      ** c
1e010 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f  orrectly. posix_
1e020 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64  fallocate() is d
1e030 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72  efined to "retur
1e040 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65  ns zero on succe
1e050 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72  ss, .      ** or
1e060 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72   an error number
1e070 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53   on  failure". S
1e080 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66  ee the manpage f
1e090 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
1e0a0 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20       int err;.  
1e0b0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
1e0c0 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74  err = osFallocat
1e0d0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e  e(pFile->h, buf.
1e0e0 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62  st_size, nSize-b
1e0f0 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20  uf.st_size);.   
1e100 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d     }while( err==
1e110 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69  EINTR );.      i
1e120 66 28 20 65 72 72 20 29 20 72 65 74 75 72 6e 20  f( err ) return 
1e130 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1e140 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  TE;.#else.      
1e150 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65  /* If the OS doe
1e160 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78  s not have posix
1e170 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61  _fallocate(), fa
1e180 6b 65 20 69 74 2e 20 57 72 69 74 65 20 61 20 0a  ke it. Write a .
1e190 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
1e1a0 62 79 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74  byte to the last
1e1b0 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c   byte in each bl
1e1c0 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c 73 20 65  ock that falls e
1e1d0 6e 74 69 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a  ntirely.      **
1e1e0 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65   within the exte
1e1f0 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 65  nded region. The
1e200 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64 2c 20  n, if required, 
1e210 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
1e220 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
1e230 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73   (nSize-1), to s
1e240 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
1e250 68 65 20 66 69 6c 65 20 63 6f 72 72 65 63 74 6c  he file correctl
1e260 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  y..      ** This
1e270 20 69 73 20 61 20 73 69 6d 69 6c 61 72 20 74 65   is a similar te
1e280 63 68 6e 69 71 75 65 20 74 6f 20 74 68 61 74 20  chnique to that 
1e290 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 6f 6e  used by glibc on
1e2a0 20 73 79 73 74 65 6d 73 0a 20 20 20 20 20 20 2a   systems.      *
1e2b0 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  * that do not ha
1e2c0 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63  ve a real falloc
1e2d0 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20  ate() call..    
1e2e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
1e2f0 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b  Blk = buf.st_blk
1e300 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73  size;  /* File-s
1e310 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65  ystem block size
1e320 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 57   */.      int nW
1e330 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rite = 0;       
1e340 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e350 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
1e360 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65   by seekAndWrite
1e370 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57   */.      i64 iW
1e380 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
1e390 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
1e3a0 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f  fset to write to
1e3b0 20 2a 2f 0a 0a 20 20 20 20 20 20 69 57 72 69 74   */..      iWrit
1e3c0 65 20 3d 20 28 62 75 66 2e 73 74 5f 73 69 7a 65  e = (buf.st_size
1e3d0 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42  /nBlk)*nBlk + nB
1e3e0 6c 6b 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73  lk - 1;.      as
1e3f0 73 65 72 74 28 20 69 57 72 69 74 65 3e 3d 62 75  sert( iWrite>=bu
1e400 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20  f.st_size );.   
1e410 20 20 20 61 73 73 65 72 74 28 20 28 28 69 57 72     assert( ((iWr
1e420 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20  ite+1)%nBlk)==0 
1e430 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e  );.      for(/*n
1e440 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e  o-op*/; iWrite<n
1e450 53 69 7a 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72  Size+nBlk-1; iWr
1e460 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20  ite+=nBlk ){.   
1e470 20 20 20 20 20 69 66 28 20 69 57 72 69 74 65 3e       if( iWrite>
1e480 3d 6e 53 69 7a 65 20 29 20 69 57 72 69 74 65 20  =nSize ) iWrite 
1e490 3d 20 6e 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20  = nSize - 1;.   
1e4a0 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 65       nWrite = se
1e4b0 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1e4c0 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29  , iWrite, "", 1)
1e4d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57  ;.        if( nW
1e4e0 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e  rite!=1 ) return
1e4f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1e500 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ITE;.      }.#en
1e510 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  dif.    }.  }..#
1e520 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1e530 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
1e540 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1e550 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46  ax>0 && nByte>pF
1e560 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1e570 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1e580 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1e590 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk<=0 ){.      
1e5a0 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
1e5b0 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
1e5c0 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
1e5d0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1e5e0 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
1e5f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e         return un
1e600 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1e610 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1e620 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
1e630 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1e640 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1e650 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
1e660 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  e(pFile, nByte);
1e670 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1e680 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1e690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e6a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  }../*.** If *pAr
1e6b0 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e  g is initially n
1e6c0 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
1e6d0 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
1e6e0 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
1e6f0 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
1e700 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
1e710 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
1e720 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
1e730 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
1e740 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
1e750 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
1e760 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
1e770 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
1e780 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
1e790 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28  oid unixModeBit(
1e7a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
1e7b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
1e7c0 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
1e7d0 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
1e7e0 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
1e7f0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1e800 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
1e810 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
1e820 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
1e830 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
1e840 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
1e850 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1e860 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
1e870 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
1e880 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
1e890 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
1e8a0 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
1e8b0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a  , char *zBuf);..
1e8c0 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
1e8d0 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
1e8e0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
1e8f0 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1e900 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
1e910 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1e920 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
1e930 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69  id *pArg){.  uni
1e940 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1e950 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1e960 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1e970 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e980 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
1e990 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1e9a0 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c  rg = pFile->eFil
1e9b0 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74  eLock;.      ret
1e9c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e9d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1e9e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f  LITE_FCNTL_LAST_
1e9f0 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
1ea00 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1ea10 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
1ea20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ea30 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1ea40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1ea50 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
1ea60 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a  .      pFile->sz
1ea70 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29  Chunk = *(int *)
1ea80 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75  pArg;.      retu
1ea90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1eaa0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1eab0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1eac0 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  INT: {.      int
1ead0 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   rc;.      Simul
1eae0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1eaf0 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  (1);.      rc = 
1eb00 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46  fcntlSizeHint(pF
1eb10 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72  ile, *(i64 *)pAr
1eb20 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  g);.      Simula
1eb30 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1eb40 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
1eb50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   rc;.    }.    c
1eb60 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1eb70 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
1eb80 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69        unixModeBi
1eb90 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c  t(pFile, UNIXFIL
1eba0 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
1ebb0 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
1ebc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ebd0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1ebe0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ebf0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1ec00 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69  ITE: {.      uni
1ec10 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  xModeBit(pFile, 
1ec20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28  UNIXFILE_PSOW, (
1ec30 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
1ec40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ec50 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1ec60 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ec70 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  VFSNAME: {.     
1ec80 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
1ec90 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1eca0 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56  ("%s", pFile->pV
1ecb0 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  fs->zName);.    
1ecc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ecd0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1ece0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ecf0 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
1ed00 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
1ed10 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
1ed20 6c 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56  loc64( pFile->pV
1ed30 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
1ed40 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69  ;.      if( zTFi
1ed50 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  le ){.        un
1ed60 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46  ixGetTempname(pF
1ed70 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
1ed80 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a  hname, zTFile);.
1ed90 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
1eda0 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
1edb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1edc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1edd0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1ede0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f  QLITE_FCNTL_HAS_
1edf0 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a  MOVED: {.      *
1ee00 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c  (int*)pArg = fil
1ee10 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29  eHasMoved(pFile)
1ee20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1ee30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1ee40 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1ee50 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63  MAP_SIZE>0.    c
1ee60 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1ee70 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
1ee80 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74      i64 newLimit
1ee90 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a   = *(i64*)pArg;.
1eea0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
1eeb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1eec0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c  if( newLimit>sql
1eed0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1eee0 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20  .mxMmap ){.     
1eef0 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71     newLimit = sq
1ef00 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ef10 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  g.mxMmap;.      
1ef20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  }.      *(i64*)p
1ef30 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
1ef40 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
1ef50 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
1ef60 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
1ef70 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
1ef80 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
1ef90 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
1efa0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1efb0 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
1efc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
1efd0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
1efe0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  {.          unix
1eff0 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
1f000 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1f010 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
1f020 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  le, -1);.       
1f030 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1f040 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f050 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1f060 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1f070 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
1f080 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
1f090 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
1f0a0 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
1f0b0 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
1f0c0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1f0d0 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
1f0e0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
1f0f0 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
1f100 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
1f110 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
1f120 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
1f130 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
1f140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1f150 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
1f160 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
1f170 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1f180 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
1f190 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1f1a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f1b0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
1f1c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1f1d0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1f1e0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1f1f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f200 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
1f210 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
1f220 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
1f230 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1f240 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1f250 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1f260 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
1f270 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1f280 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1f290 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1f2a0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1f2b0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1f2c0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1f2d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f2e0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1f2f0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
1f300 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
1f310 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
1f320 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1f330 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
1f340 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
1f350 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
1f360 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
1f370 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
1f380 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
1f390 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
1f3a0 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
1f3b0 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
1f3c0 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
1f3d0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
1f3e0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
1f3f0 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
1f400 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
1f410 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
1f420 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
1f430 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
1f440 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
1f450 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
1f460 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e  .*/.#ifndef __QN
1f470 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69  XNTO__ .static i
1f480 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1f490 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1f4a0 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1f4b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1f4c0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1f4d0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1f4e0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65  ECTOR_SIZE;.}.#e
1f4f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1f500 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f  following versio
1f510 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53  n of unixSectorS
1f520 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a  ize() is optimiz
1f530 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23  ed for QNX..*/.#
1f540 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
1f550 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64  .#include <sys/d
1f560 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c  cmd_blk.h>.#incl
1f570 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73  ude <sys/statvfs
1f580 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .h>.static int u
1f590 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
1f5a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1f5b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1f5c0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1f5d0 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  id;.  if( pFile-
1f5e0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30  >sectorSize == 0
1f5f0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1f600 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20  tatvfs fsInfo;. 
1f610 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65        .    /* Se
1f620 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e  t defaults for n
1f630 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c  on-supported fil
1f640 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20  esystems */.    
1f650 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1f660 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1f670 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1f680 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1f690 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f6a0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73   = 0;.    if( fs
1f6b0 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c  tatvfs(pFile->h,
1f6c0 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
1f6d0 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
1f6e0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f6f0 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ze;.    }..    i
1f700 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1f710 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74  o.f_basetype, "t
1f720 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70  mp") ) {.      p
1f730 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f740 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1f750 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1f760 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1f770 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1f780 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1f790 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a  MIC4K |       /*
1f7a0 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73   All ram filesys
1f7b0 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61  tem writes are a
1f7c0 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
1f7d0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1f7e0 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1f7f0 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1f800 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1f810 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f840 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1f850 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1f860 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1f870 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1f880 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1f890 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1f8a0 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f8d0 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1f8e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1f8f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1f900 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
1f910 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29  etype, "etfs") )
1f920 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1f930 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1f940 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1f950 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f960 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f970 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73  .        /* etfs
1f980 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72   cluster size wr
1f990 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1f9a0 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c  */.        (pFil
1f9b0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
1f9c0 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
1f9d0 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a  AP_ATOMIC512) |.
1f9e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1f9f0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1fa00 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
1fa10 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1fa20 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
1fa60 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
1fa70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1fa80 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1fa90 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1faa0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1fab0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fae0 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1faf0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1fb00 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1fb10 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1fb20 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1fb30 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx6") ){.      
1fb40 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1fb50 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1fb60 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1fb70 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1fb80 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1fb90 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1fba0 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f  OMIC |         /
1fbb0 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d  * All filesystem
1fbc0 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
1fbd0 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1fbe0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1fbf0 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1fc00 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1fc10 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1fc20 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1fc50 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1fc60 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1fc70 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1fc80 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1fc90 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1fca0 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1fcb0 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1fce0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1fcf0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1fd00 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
1fd10 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
1fd20 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a  ype, "qnx4") ){.
1fd30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1fd40 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1fd50 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1fd60 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1fd70 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1fd80 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
1fd90 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
1fda0 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
1fdb0 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
1fdc0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
1fdd0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1fde0 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
1fdf0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
1fe00 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
1fe10 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1fe20 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1fe30 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1fe40 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1fe50 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe80 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1fe90 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1fea0 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1feb0 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
1fec0 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f  .f_basetype, "do
1fed0 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
1fee0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1fef0 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1ff00 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1ff10 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1ff20 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1ff30 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
1ff40 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
1ff50 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
1ff60 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
1ff70 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
1ff80 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
1ff90 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1ffa0 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
1ffb0 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
1ffc0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1ffd0 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1ffe0 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1fff0 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
20000 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20020 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
20030 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
20040 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
20050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
20060 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
20070 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
20080 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
20090 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20  _ATOMIC512 |    
200a0 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20    /* blocks are 
200b0 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
200c0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
200d0 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
200e0 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
200f0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
20100 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
20130 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
20140 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
20150 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  0;.    }.  }.  /
20160 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65  * Last chance ve
20170 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20  rification.  If 
20180 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
20190 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65  isn't a multiple
201a0 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65   of 512.  ** the
201b0 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64  n it isn't valid
201c0 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .*/.  if( pFile-
201d0 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31  >sectorSize % 51
201e0 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  2 != 0 ){.    pF
201f0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
20200 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
20210 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
20220 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
20230 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
20240 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
20250 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
20260 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
20270 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f  __QNXNTO__ */../
20280 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20290 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
202a0 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
202b0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
202c0 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f  VFS is set up to
202d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
202e0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
202f0 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61  VERWRITE by defa
20300 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ult..** However,
20310 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20   that choice is 
20320 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69  controversial si
20330 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20  nce technically 
20340 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
20350 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f  * file system do
20360 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72  es not always pr
20370 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20  ovide powersafe 
20380 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e  overwrites.  (In
20390 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
203a0 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c   after a power-l
203b0 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73  oss event, parts
203c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61   of the file tha
203d0 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20  t were never.** 
203e0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e  written might en
203f0 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72  d up being alter
20400 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e  ed.)  However, n
20410 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72  on-PSOW behavior
20420 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72   is very,.** ver
20430 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73  y rare.  And ass
20440 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65  erting PSOW make
20450 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74  s a large reduct
20460 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e  ion in the amoun
20470 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64  t.** of required
20480 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c   I/O for journal
20490 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74  ing, since a lot
204a0 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65   of padding is e
204b0 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48  liminated..**  H
204c0 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45  ence, while POWE
204d0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
204e0 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
204f0 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c  , there is a fil
20500 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61  e-control.** ava
20510 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
20520 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75  t off and URI qu
20530 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76  ery parameter av
20540 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
20550 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  it off..*/.stati
20560 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
20570 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
20580 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
20590 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
205a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
205b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
205c0 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
205d0 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f  _.  if( p->secto
205e0 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53  rSize==0 ) unixS
205f0 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20  ectorSize(id);. 
20600 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43   rc = p->deviceC
20610 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a  haracteristics;.
20620 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
20630 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
20640 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20  FILE_PSOW ){.   
20650 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f   rc |= SQLITE_IO
20660 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
20670 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72  ERWRITE;.  }.  r
20680 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
20690 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
206a0 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
206b0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
206c0 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ZE>0../*.** Retu
206d0 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70 61  rn the system pa
206e0 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
206f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
20700 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
20710 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74  d directly by ot
20720 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73  her code in this
20730 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65   file. .** Inste
20740 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65  ad, it should be
20750 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72   called via macr
20760 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  o osGetpagesize(
20770 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
20780 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65   unixGetpagesize
20790 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56  (void){.#if OS_V
207a0 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
207b0 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69  1024;.#elif defi
207c0 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29  ned(_BSD_SOURCE)
207d0 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61 67  .  return getpag
207e0 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20  esize();.#else. 
207f0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73   return (int)sys
20800 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a  conf(_SC_PAGESIZ
20810 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65  E);.#endif.}..#e
20820 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
20830 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
20840 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
20850 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
20860 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20870 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f  MIT_WAL../*.** O
20880 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
20890 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65  present an share
208a0 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  d memory buffer.
208b0 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75    .**.** When mu
208c0 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
208d0 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
208e0 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c   same wal-index,
208f0 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20   each thread.** 
20900 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78  has its own unix
20910 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  Shm object, but 
20920 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74  they all point t
20930 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
20940 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75  nce.** of this u
20950 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20960 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
20970 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64  ds, each wal-ind
20980 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  ex is opened.** 
20990 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
209a0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ocess..**.** Eac
209b0 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  h unixShmNode ob
209c0 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  ject is connecte
209d0 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e  d to a single un
209e0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
209f0 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ct..** We could 
20a00 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62  coalesce this ob
20a10 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e  ject into unixIn
20a20 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61  odeInfo, but tha
20a30 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20  t would mean.** 
20a40 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20  every open file 
20a50 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
20a60 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
20a70 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
20a80 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69   most.** open fi
20a90 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20  les) would have 
20aa0 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20  to carry around 
20ab0 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72  this extra infor
20ac0 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74  mation.  So.** t
20ad0 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
20ae0 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
20af0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
20b00 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
20b10 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65  bject.** and the
20b20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20b30 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f  ect is created o
20b40 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e  nly when needed.
20b50 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  .**.** unixMutex
20b60 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
20b70 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
20b80 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
20b90 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
20ba0 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
20bb0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
20bc0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
20bd0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
20be0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
20bf0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
20c00 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
20c10 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
20c20 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
20c30 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
20c40 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
20c50 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ither unixShmNod
20c60 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
20c70 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e  held or unixShmN
20c80 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
20c90 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
20ca0 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
20cb0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
20cc0 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
20cd0 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
20ce0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
20cf0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b  ct unixShmNode {
20d00 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
20d10 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a   *pInode;     /*
20d20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74   unixInodeInfo t
20d30 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48  hat owns this SH
20d40 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  M node */.  sqli
20d50 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
20d60 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
20d70 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
20d80 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
20d90 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
20da0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
20db0 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c   the mmapped fil
20dc0 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20de0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
20df0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
20e00 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
20e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20e20 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
20e30 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
20e40 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  u16 nRegion;    
20e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
20e60 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
20e70 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52  gion */.  u8 isR
20e80 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadonly;        
20e90 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20ea0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63  read-only */.  c
20eb0 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20  har **apRegion; 
20ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
20ed0 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61  ay of mapped sha
20ee0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
20ef0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ns */.  int nRef
20f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20f10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20f20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
20f30 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
20f40 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
20f50 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
20f60 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20   /* All unixShm 
20f70 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
20f80 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64   to this */.#ifd
20f90 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
20fa0 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20    u8 exclMask;  
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20fc0 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
20fd0 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
20fe0 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b    u8 sharedMask;
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21000 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
21010 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
21020 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
21030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
21040 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78  t available unix
21050 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
21060 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
21070 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
21080 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
21090 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
210a0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
210b0 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
210c0 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
210d0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
210e0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
210f0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
21100 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
21110 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
21120 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
21130 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
21140 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c      unixShm.pFil
21150 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  e.**    unixShm.
21160 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
21170 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
21180 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75  ad/write.  The u
21190 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75  nixShm.pFile->mu
211a0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
211b0 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
211c0 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
211d0 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
211e0 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20  ruct unixShm {. 
211f0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
21200 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54  hmNode;     /* T
21210 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e  he underlying un
21220 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
21230 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
21240 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
21250 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d   /* Next unixShm
21260 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75   with the same u
21270 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
21280 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20  u8 hasMutex;    
21290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
212a0 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68  ue if holding th
212b0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75  e unixShmNode mu
212c0 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20  tex */.  u8 id; 
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
212f0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
21300 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e  hin its unixShmN
21310 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  ode */.  u16 sha
21320 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
21330 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
21340 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
21350 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
21360 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
21370 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
21380 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
21390 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
213a0 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
213b0 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
213c0 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53  ine UNIX_SHM_BAS
213d0 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
213e0 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
213f0 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
21400 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
21410 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  ine UNIX_SHM_DMS
21420 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41      (UNIX_SHM_BA
21430 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
21440 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
21450 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
21460 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64  * Apply posix ad
21470 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
21480 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20   all bytes from 
21490 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73  ofst through ofs
214a0 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  t+n-1..**.** Loc
214b0 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20  ks block if the 
214c0 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20  mask is exactly 
214d0 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61  UNIX_SHM_C and a
214e0 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a  re non-blocking.
214f0 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
21500 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
21510 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
21520 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
21530 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ,       /* Open 
21540 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
21550 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20  e WAL file */.  
21560 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
21570 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43         /* F_UNLC
21580 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46  K, F_RDLCK, or F
21590 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
215a0 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
215b0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
215c0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
215d0 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  range */.  int n
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
21600 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
21610 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
21620 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41   *pShmNode; /* A
21630 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
21640 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
21650 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
21660 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
21670 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  f;        /* The
21680 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
21690 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
216a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
216b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
216c0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
216d0 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20  m fcntl() */..  
216e0 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
216f0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
21700 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
21710 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
21720 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  */.  pShmNode = 
21730 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
21740 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72  ShmNode;.  asser
21750 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
21760 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  _held(pShmNode->
21770 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f  mutex) || pShmNo
21780 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  de->nRef==0 );..
21790 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b    /* Shared lock
217a0 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72  s never span mor
217b0 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20  e than one byte 
217c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  */.  assert( n==
217d0 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46  1 || lockType!=F
217e0 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  _RDLCK );..  /* 
217f0 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e  Locks are within
21800 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65   range */.  asse
21810 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53  rt( n>=1 && n<=S
21820 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
21830 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
21840 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
21850 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
21860 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
21870 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  ters */.    mems
21880 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&f, 0, sizeof
21890 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79  (f));.    f.l_ty
218a0 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20  pe = lockType;. 
218b0 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20     f.l_whence = 
218c0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e  SEEK_SET;.    f.
218d0 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a  l_start = ofst;.
218e0 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b      f.l_len = n;
218f0 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  ..    rc = osFcn
21900 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  tl(pShmNode->h, 
21910 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20  F_SETLK, &f);.  
21920 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29    rc = (rc!=(-1)
21930 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  ) ? SQLITE_OK : 
21940 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
21950 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
21960 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74  e global lock st
21970 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67  ate and do debug
21980 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64   tracing */.#ifd
21990 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
219a0 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20    { u16 mask;.  
219b0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
219c0 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d  CK "));.  mask =
219d0 20 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66   ofst>31 ? 0xfff
219e0 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  f : (1<<(ofst+n)
219f0 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
21a00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21a10 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f  OK ){.    if( lo
21a20 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
21a30 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
21a40 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22  (("unlock %d ok"
21a50 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
21a60 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
21a70 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
21a80 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
21a90 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
21aa0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
21ab0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
21ac0 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
21ad0 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25  CE(("read-lock %
21ae0 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
21af0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
21b00 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
21b10 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
21b20 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
21b30 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  mask;.    }else{
21b40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
21b50 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
21b60 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
21b70 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
21b80 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
21b90 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
21ba0 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
21bb0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21bc0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
21bd0 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
21be0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  lse{.    if( loc
21bf0 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
21c00 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
21c10 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ("unlock %d fail
21c20 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
21c30 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
21c40 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
21c50 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21c60 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64  read-lock failed
21c70 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  "));.    }else{.
21c80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
21c90 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
21ca0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
21cb0 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
21cc0 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
21cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
21ce0 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72  TRACE((" - after
21cf0 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c  wards %03x,%03x\
21d00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
21d10 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
21d20 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65  ask, pShmNode->e
21d30 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23  xclMask));.  }.#
21d40 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
21d50 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f  rc;        .}../
21d60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21d70 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  minimum number o
21d80 66 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f  f 32KB shm regio
21d90 6e 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ns that should b
21da0 65 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61  e mapped at.** a
21db0 20 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20   time, assuming 
21dc0 74 68 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e  that each mappin
21dd0 67 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74  g must be an int
21de0 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
21df0 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
21e00 73 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65  system page-size
21e10 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c  ..**.** Usually,
21e20 20 74 68 69 73 20 69 73 20 31 2e 20 54 68 65 20   this is 1. The 
21e30 65 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20  exception seems 
21e40 74 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74 68  to be systems th
21e50 61 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65  at are configure
21e60 64 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42  d.** to use 64KB
21e70 20 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73   pages - in this
21e80 20 63 61 73 65 20 65 61 63 68 20 6d 61 70 70 69   case each mappi
21e90 6e 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74  ng must cover at
21ea0 20 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68   least two.** sh
21eb0 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  m regions..*/.st
21ec0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
21ed0 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69  RegionPerMap(voi
21ee0 64 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20  d){.  int shmsz 
21ef0 3d 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20  = 32*1024;      
21f00 20 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67        /* SHM reg
21f10 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  ion size */.  in
21f20 74 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61  t pgsz = osGetpa
21f30 67 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53  gesize();   /* S
21f40 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20  ystem page size 
21f50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28 70  */.  assert( ((p
21f60 67 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20  gsz-1)&pgsz)==0 
21f70 29 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  );   /* Page siz
21f80 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
21f90 72 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20  r of 2 */.  if( 
21fa0 70 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74  pgsz<shmsz ) ret
21fb0 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
21fc0 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f  pgsz/shmsz;.}../
21fd0 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75  *.** Purge the u
21fe0 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  nixShmNodeList l
21ff0 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
22000 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e  es with unixShmN
22010 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
22020 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
22030 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
22040 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
22050 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
22060 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
22070 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
22080 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
22090 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
220a0 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65  hmPurge(unixFile
220b0 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68   *pFd){.  unixSh
220c0 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e  mNode *p = pFd->
220d0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
220e0 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
220f0 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
22100 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53   if( p && ALWAYS
22110 28 70 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a  (p->nRef==0) ){.
22120 20 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d      int nShmPerM
22130 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69  ap = unixShmRegi
22140 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20  onPerMap();.    
22150 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
22160 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46  t( p->pInode==pF
22170 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  d->pInode );.   
22180 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
22190 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
221a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
221b0 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68  >nRegion; i+=nSh
221c0 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20 20 20 20  mPerMap){.      
221d0 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
221e0 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28         osMunmap(
221f0 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20  p->apRegion[i], 
22200 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  p->szRegion);.  
22210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22220 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22230 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b  p->apRegion[i]);
22240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22250 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22260 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20  p->apRegion);.  
22270 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
22280 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
22290 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f  ose(pFd, p->h, _
222a0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
222b0 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  p->h = -1;.    }
222c0 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e  .    p->pInode->
222d0 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  pShmNode = 0;.  
222e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
222f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
22300 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65  Open a shared-me
22310 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69  mory area associ
22320 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64  ated with open d
22330 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
22340 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61  Fd.  .** This pa
22350 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65  rticular impleme
22360 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61  ntation uses mma
22370 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  pped files..**.*
22380 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20  * The file used 
22390 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61  to implement sha
223a0 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e  red-memory is in
223b0 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
223c0 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70  ory.** as the op
223d0 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
223e0 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
223f0 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70  e name as the op
22400 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  en database.** f
22410 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73  ile with the "-s
22420 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64  hm" suffix added
22430 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
22440 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
22450 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d  file.** is "/hom
22460 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
22470 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  b" then the file
22480 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
22490 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20   and mmapped.** 
224a0 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
224b0 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  y will be called
224c0 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
224d0 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a  nfig.db-shm".  .
224e0 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70  **.** Another ap
224f0 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20  proach to is to 
22500 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65  use files in /de
22510 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d  v/shm or /dev/tm
22520 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20  p or an.** some 
22530 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e  other tmpfs moun
22540 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65  t. But if a file
22550 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
22560 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f  directory.** fro
22570 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
22580 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  ile is used, the
22590 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65  n differing acce
225a0 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ss permissions.*
225b0 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20  * or a chroot() 
225c0 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20  might cause two 
225d0 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
225e0 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ses on the same.
225f0 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65  ** database to e
22600 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66  nd up using diff
22610 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20  erent files for 
22620 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20  shared memory - 
22630 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  .** meaning that
22640 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f   their memory wo
22650 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  uld not really b
22660 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c  e shared - resul
22670 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62  ting.** in datab
22680 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
22690 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74   Nevertheless, t
226a0 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75  his tmpfs file u
226b0 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65  sage.** can be e
226c0 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
226d0 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
226e0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
226f0 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a  ORY="/dev/shm".*
22700 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c  * or the equival
22710 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66  ent.  The use of
22720 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   the SQLITE_SHM_
22730 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
22740 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e  e-time.** option
22750 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69   results in an i
22760 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c  ncompatible buil
22770 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75  d of SQLite;  bu
22780 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a  ilds of SQLite.*
22790 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66  * that with diff
227a0 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d  ering SQLITE_SHM
227b0 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69  _DIRECTORY setti
227c0 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75  ngs attempt to u
227d0 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64  se the.** same d
227e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
227f0 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64  the same time, d
22800 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
22810 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  on will likely.*
22820 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51  * result. The SQ
22830 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22840 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  RY compile-time 
22850 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64  option is consid
22860 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f  ered.** "unsuppo
22870 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f  rted" and may go
22880 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72   away in a futur
22890 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65  e SQLite release
228a0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
228b0 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
228c0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
228d0 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
228e0 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
228f0 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
22900 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
22910 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
22920 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
22930 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
22940 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
22950 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
22960 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
22970 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a  ader cleared..**
22980 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69  .** If the origi
22990 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
229a0 65 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69  e (pDbFd) is usi
229b0 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63  ng the "unix-exc
229c0 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d  l" VFS.** that m
229d0 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63  eans that an exc
229e0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
229f0 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
22a00 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20  ase file and.** 
22a10 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
22a20 6f 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65  ocesses are able
22a30 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
22a40 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  e the database. 
22a50 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65   In.** that case
22a60 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c  , we do not real
22a70 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d  ly need shared m
22a80 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65  emory.  No share
22a90 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65  d memory.** file
22aa0 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
22ab0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
22ac0 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65  will be simulate
22ad0 64 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f  d with heap memo
22ae0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
22af0 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  t unixOpenShared
22b00 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20  Memory(unixFile 
22b10 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
22b20 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30  t unixShm *p = 0
22b30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
22b40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
22b50 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
22b60 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
22b70 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f  e *pShmNode;   /
22b80 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
22b90 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
22ba0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bc0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
22bd0 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
22be0 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
22bf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
22c00 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63  ode of fd */.  c
22c10 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d  har *zShmFilenam
22c20 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
22c30 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
22c40 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20  le used for SHM 
22c50 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c  */.  int nShmFil
22c60 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
22c70 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22c80 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65  the SHM filename
22c90 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
22ca0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
22cb0 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e  e for the new un
22cc0 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f  ixShm object. */
22cd0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
22ce0 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
22cf0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
22d00 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
22d10 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
22d20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
22d30 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65  eof(*p));.  asse
22d40 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
22d50 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
22d60 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e  k to see if a un
22d70 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
22d80 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
22d90 20 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   Reuse an existi
22da0 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70  ng.  ** one if p
22db0 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61  resent. Create a
22dc0 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
22dd0 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e  ssary..  */.  un
22de0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
22df0 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64    pInode = pDbFd
22e00 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d  ->pInode;.  pShm
22e10 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Node = pInode->p
22e20 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70  ShmNode;.  if( p
22e30 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
22e40 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
22e50 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
22e60 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20       /* fstat() 
22e70 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73  info for databas
22e80 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65  e file */.#ifnde
22e90 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
22ea0 45 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74  ECTORY.    const
22eb0 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68   char *zBasePath
22ec0 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b   = pDbFd->zPath;
22ed0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
22ee0 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20  Call fstat() to 
22ef0 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70  figure out the p
22f00 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
22f10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22f20 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77   If.    ** a new
22f30 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63   *-shm file is c
22f40 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d  reated, an attem
22f50 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  pt will be made 
22f60 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20  to create it.   
22f70 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d   ** with the sam
22f80 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20  e permissions.. 
22f90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73     */.    if( os
22fa0 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20  Fstat(pDbFd->h, 
22fb0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
22fc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
22fd0 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20  RR_FSTAT;.      
22fe0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
22ff0 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  r;.    }..#ifdef
23000 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
23010 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69  CTORY.    nShmFi
23020 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28  lename = sizeof(
23030 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
23040 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73  TORY) + 31;.#els
23050 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  e.    nShmFilena
23060 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74  me = 6 + (int)st
23070 72 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b  rlen(zBasePath);
23080 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
23090 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Node = sqlite3_m
230a0 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
230b0 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68  *pShmNode) + nSh
230c0 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20  mFilename );.   
230d0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
230e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
230f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
23100 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
23110 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
23120 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d  .    memset(pShm
23130 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Node, 0, sizeof(
23140 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46  *pShmNode)+nShmF
23150 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53  ilename);.    zS
23160 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68  hmFilename = pSh
23170 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
23180 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e   = (char*)&pShmN
23190 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53  ode[1];.#ifdef S
231a0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
231b0 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ORY.    sqlite3_
231c0 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c  snprintf(nShmFil
231d0 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e  ename, zShmFilen
231e0 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
231f0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
23200 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
23210 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d  "/sqlite-shm-%x-
23220 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %x",.           
23230 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73            (u32)s
23240 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33  Stat.st_ino, (u3
23250 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b  2)sStat.st_dev);
23260 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74  .#else.    sqlit
23270 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
23280 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
23290 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
232a0 2c 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20  , zBasePath);.  
232b0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
232c0 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74  fix3(pDbFd->zPat
232d0 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  h, zShmFilename)
232e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
232f0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  mNode->h = -1;. 
23300 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65     pDbFd->pInode
23310 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
23320 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  mNode;.    pShmN
23330 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44  ode->pInode = pD
23340 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20  bFd->pInode;.   
23350 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
23360 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
23370 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70 53 68  tex ){.      pSh
23380 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73  mNode->mutex = s
23390 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
233a0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
233b0 46 41 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28  FAST);.      if(
233c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
233d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
233e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
233f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
23400 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
23410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23420 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
23430 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
23440 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
23450 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
23460 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20   | O_CREAT;.    
23470 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
23480 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d  i_boolean(pDbFd-
23490 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c  >zPath, "readonl
234a0 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20  y_shm", 0) ){.  
234b0 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
234c0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
234d0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
234e0 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
234f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
23500 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74  Node->h = robust
23510 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61  _open(zShmFilena
23520 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28  me, openFlags, (
23530 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37  sStat.st_mode&07
23540 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  77));.      if( 
23550 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b  pShmNode->h<0 ){
23560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
23570 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
23580 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
23590 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c   "open", zShmFil
235a0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
235b0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
235c0 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
235d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f    /* If this pro
235e0 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  cess is running 
235f0 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75  as root, make su
23600 72 65 20 74 68 61 74 20 74 68 65 20 53 48 4d 20  re that the SHM 
23610 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  file.      ** is
23620 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73 61   owned by the sa
23630 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f 77 6e  me user that own
23640 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
23650 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72 77  atabase.  Otherw
23660 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ise,.      ** th
23670 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72  e original owner
23680 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
23690 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20  e to connect..  
236a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62      */.      rob
236b0 75 73 74 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f  ustFchown(pShmNo
236c0 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f  de->h, sStat.st_
236d0 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69  uid, sStat.st_gi
236e0 64 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  d);.  .      /* 
236f0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23700 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
23710 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
23720 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
23730 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c        ** If not,
23740 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
23750 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
23760 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  h. .      */.   
23770 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23780 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  K;.      if( uni
23790 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
237a0 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55  DbFd, F_WRLCK, U
237b0 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  NIX_SHM_DMS, 1)=
237c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
237d0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
237e0 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
237f0 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20  ode->h, 0) ){.  
23800 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
23810 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
23820 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
23830 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68  "ftruncate", zSh
23840 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
23850 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23860 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23870 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23880 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
23890 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
238a0 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _RDLCK, UNIX_SHM
238b0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
238c0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
238d0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
238e0 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rr;.    }.  }.. 
238f0 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
23900 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
23910 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53  ild of the unixS
23920 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
23930 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
23940 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  de;.#ifdef SQLIT
23950 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
23960 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74  = pShmNode->next
23970 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ShmId++;.#endif.
23980 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
23990 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  ++;.  pDbFd->pSh
239a0 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61  m = p;.  unixLea
239b0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
239c0 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
239d0 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
239e0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
239f0 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
23a00 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
23a10 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e  er of the unixEn
23a20 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78  terMutex() mutex
23a30 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72   and the pointer
23a40 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e   from the.  ** n
23a50 65 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53  ew (struct unixS
23a60 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  hm) object to th
23a70 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62  e pShmNode has b
23a80 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61  een set. All tha
23a90 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74  t is.  ** left t
23aa0 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20  o do is to link 
23ab0 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
23ac0 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
23ad0 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ist starting.  *
23ae0 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  * at pShmNode->p
23af0 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74  First. This must
23b00 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68   be done while h
23b10 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e  olding the pShmN
23b20 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a  ode->mutex .  **
23b30 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
23b40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
23b50 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
23b60 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
23b70 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
23b80 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
23b90 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
23ba0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
23bb0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
23bc0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
23bd0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
23be0 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
23bf0 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
23c00 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50  _err:.  unixShmP
23c10 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20  urge(pDbFd);    
23c20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
23c30 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69  frees pShmNode i
23c40 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
23c50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
23c60 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
23c70 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
23c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
23c90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
23ca0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
23cb0 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
23cc0 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
23cd0 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
23ce0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
23cf0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
23d00 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
23d10 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
23d20 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
23d30 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
23d40 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
23d50 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
23d60 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
23d70 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
23d80 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
23d90 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
23da0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
23db0 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
23dc0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
23dd0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
23de0 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65  bExtend paramete
23df0 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
23e00 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
23e10 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
23e20 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
23e30 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
23e40 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
23e50 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
23e60 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
23e70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
23e80 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
23e90 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
23ea0 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
23eb0 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a  bExtend is non-z
23ec0 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
23ed0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
23ee0 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
23ef0 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
23f00 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
23f10 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
23f20 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
23f30 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
23f40 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
23f50 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
23f60 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
23f70 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
23f80 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
23f90 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
23fa0 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
23fb0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
23fc0 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
23fd0 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
23fe0 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
23ff0 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
24000 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
24010 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
24020 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24030 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
24040 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73   unixShmMap(.  s
24050 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24070 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e  * Handle open on
24080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24090 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c  /.  int iRegion,
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f      /* Region to
240c0 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69   retrieve */.  i
240d0 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20  nt szRegion,    
240e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
240f0 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e  * Size of region
24100 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65  s */.  int bExte
24110 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
24120 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
24130 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66  o extend file if
24140 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
24150 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
24160 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pp              
24170 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d  /* OUT: Mapped m
24180 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e  emory */.){.  un
24190 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
241a0 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
241b0 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75   unixShm *p;.  u
241c0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
241d0 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
241e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
241f0 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75  t nShmPerMap = u
24200 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
24210 61 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71  ap();.  int nReq
24220 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66  Region;..  /* If
24230 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
24240 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
24250 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
24260 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
24270 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
24280 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
24290 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
242a0 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
242b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
242c0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
242d0 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
242e0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
242f0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
24300 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
24310 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
24320 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
24330 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
24340 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
24350 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
24360 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  nRegion==0 );.  
24370 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
24380 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
24390 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
243a0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
243b0 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
243c0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
243d0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
243e0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
243f0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
24400 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
24410 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69  =0 );..  /* Mini
24420 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
24430 67 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74  gions required t
24440 6f 20 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a  o be mapped. */.
24450 20 20 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20 28    nReqRegion = (
24460 28 69 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72  (iRegion+nShmPer
24470 4d 61 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61  Map) / nShmPerMa
24480 70 29 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b  p) * nShmPerMap;
24490 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
244a0 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65  ->nRegion<nReqRe
244b0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
244c0 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
244e0 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
244f0 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
24500 74 20 6e 42 79 74 65 20 3d 20 6e 52 65 71 52 65  t nByte = nReqRe
24510 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  gion*szRegion;  
24520 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
24530 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
24540 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
24550 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
24560 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
24570 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
24580 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
24590 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
245a0 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  n;..    if( pShm
245b0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
245c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
245d0 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
245e0 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
245f0 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
24600 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
24610 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
24620 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
24630 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
24640 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
24650 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
24660 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
24670 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
24680 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
24690 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
246a0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
246b0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
246c0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
246d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
246e0 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
246f0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24700 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
24710 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
24720 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
24730 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
24740 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
24750 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
24760 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
24770 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
24780 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
24790 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
247a0 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
247b0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
247c0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
247d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
247e0 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20  !bExtend ){.    
247f0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
24800 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
24810 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  }..        /* Al
24820 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
24830 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
24840 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
24850 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20  . Do this by.   
24860 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20       ** writing 
24870 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
24880 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
24890 20 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67   (OS) page being
248a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
248b0 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
248c0 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  d. Technically, 
248d0 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69  we need only wri
248e0 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  te to the.      
248f0 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69    ** last page i
24900 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e  n order to exten
24910 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20  d the file. But 
24920 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e  writing to all n
24930 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ew.        ** pa
24940 67 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f  ges forces the O
24950 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  S to allocate th
24960 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  em immediately, 
24970 77 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20  which reduces.  
24980 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61        ** the cha
24990 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77  nces of SIGBUS w
249a0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74  hile accessing t
249b0 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
249c0 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20   later on..     
249d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c     */.        el
249e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
249f0 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70  atic const int p
24a00 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  gsz = 4096;.    
24a10 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a        int iPg;..
24a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
24a30 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62  te to the last b
24a40 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c  yte of each newl
24a50 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  y allocated or e
24a60 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a  xtended page */.
24a70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
24a80 28 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29  ( (nByte % pgsz)
24a90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
24aa0 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e   for(iPg=(sStat.
24ab0 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69  st_size/pgsz); i
24ac0 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b  Pg<(nByte/pgsz);
24ad0 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPg++){.       
24ae0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 30 3b 0a       int x = 0;.
24af0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24b00 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 70  seekAndWriteFd(p
24b10 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50 67 2a  ShmNode->h, iPg*
24b20 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c 20 22  pgsz + pgsz-1, "
24b30 22 2c 20 31 2c 20 26 78 29 21 3d 31 20 29 7b 0a  ", 1, &x)!=1 ){.
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
24b50 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
24b60 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
24b70 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  ename;.         
24b80 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
24b90 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
24ba0 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72  ERR_SHMSIZE, "wr
24bb0 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  ite", zFile);.  
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
24bd0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
24be0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24c00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
24c10 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
24c20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
24c30 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
24c40 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
24c50 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
24c60 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20    apNew = (char 
24c70 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
24c80 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
24c90 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20  Node->apRegion, 
24ca0 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f  nReqRegion*sizeo
24cb0 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
24cc0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
24cd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
24ce0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
24cf0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
24d00 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
24d10 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
24d20 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
24d30 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  New;.    while( 
24d40 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
24d50 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a  n<nReqRegion ){.
24d60 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d        int nMap =
24d70 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65   szRegion*nShmPe
24d80 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rMap;.      int 
24d90 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  i;.      void *p
24da0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
24db0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
24dc0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
24dd0 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 0a  osMmap(0, nMap,.
24de0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
24df0 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
24e00 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50   ? PROT_READ : P
24e10 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52  ROT_READ|PROT_WR
24e20 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ITE, .          
24e30 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53    MAP_SHARED, pS
24e40 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67  hmNode->h, szReg
24e50 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64  ion*(i64)pShmNod
24e60 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20  e->nRegion.     
24e70 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
24e80 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c  ( pMem==MAP_FAIL
24e90 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
24ea0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
24eb0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
24ec0 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70  HMMAP, "mmap", p
24ed0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
24ee0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
24ef0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
24f00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24f20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pMem = sqlite3_m
24f30 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e  alloc64(szRegion
24f40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
24f50 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
24f60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24f70 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
24f80 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
24f90 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
24fa0 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
24fb0 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69  (pMem, 0, szRegi
24fc0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  on);.      }..  
24fd0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
24fe0 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b  ShmPerMap; i++){
24ff0 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
25000 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d  e->apRegion[pShm
25010 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d  Node->nRegion+i]
25020 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65 6d   = &((char*)pMem
25030 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20  )[szRegion*i];. 
25040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
25050 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b  mNode->nRegion +
25060 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20  = nShmPerMap;.  
25070 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
25080 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
25090 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
250a0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70  egion ){.    *pp
250b0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52   = pShmNode->apR
250c0 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a  egion[iRegion];.
250d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
250e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
250f0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
25100 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49  only && rc==SQLI
25110 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
25120 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
25130 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
25140 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
25150 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
25160 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
25170 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
25180 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d  e for a shared-m
25190 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a  emory segment..*
251a0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
251b0 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
251c0 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61  between SHAREd a
251d0 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  nd EXCLUSIVE loc
251e0 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a  ks is a little.*
251f0 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65  * different here
25200 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20   than in posix. 
25210 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20   In xShmLock(), 
25220 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20  one can go from 
25230 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73  unlocked.** to s
25240 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f  hared and back o
25250 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  r from unlocked 
25260 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64  to exclusive and
25270 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20   back.  But one 
25280 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72  may.** not go fr
25290 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63  om shared to exc
252a0 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65  lusive or from e
252b0 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72  xclusive to shar
252c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
252d0 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20  t unixShmLock(. 
252e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
252f0 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
25300 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
25310 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
25320 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
25330 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
25340 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
25350 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
25360 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
25370 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
25380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25390 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
253a0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
253b0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
253c0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
253d0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
253e0 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
253f0 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
25400 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
25410 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a  ile*)fd;      /*
25420 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
25430 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
25440 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  y */.  unixShm *
25450 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25470 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
25480 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
25490 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b  /.  unixShm *pX;
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
254c0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
254d0 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
254e0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
254f0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
25500 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64  ode;  /* The und
25510 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f  erlying file iNo
25520 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  de */.  int rc =
25530 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25550 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
25560 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
25570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25580 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
25590 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
255a0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
255b0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
255c0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
255d0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
255e0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
255f0 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
25600 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
25610 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
25620 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
25630 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
25640 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
25650 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
25660 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
25670 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
25680 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
25690 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
256a0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
256b0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
256c0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
256d0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
256e0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
256f0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
25700 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
25710 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
25720 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
25730 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
25740 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
25750 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
25760 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20  CLUSIVE)!=0 );. 
25770 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
25780 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
25790 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
257a0 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
257b0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
257c0 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
257d0 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
257e0 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  ock==0 );..  mas
257f0 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
25800 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
25810 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
25820 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
25830 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
25840 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
25850 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
25860 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
25870 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
25880 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
25890 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
258a0 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
258b0 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
258c0 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
258d0 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
258e0 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
258f0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
25900 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
25910 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
25920 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
25930 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
25940 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
25950 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
25960 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
25970 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
25980 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
25990 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
259a0 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
259b0 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
259c0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
259d0 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
259e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
259f0 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
25a00 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e 4c  ock(pDbFd, F_UNL
25a10 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
25a20 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
25a30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
25a40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
25a50 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
25a60 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
25a70 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
25a80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25a90 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
25aa0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
25ab0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
25ac0 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
25ad0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
25ae0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
25af0 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
25b00 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
25b10 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
25b20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
25b30 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
25b40 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
25b50 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
25b60 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
25b70 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
25b80 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
25b90 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
25ba0 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
25bb0 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
25bc0 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
25bd0 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
25be0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
25bf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
25c00 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
25c10 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
25c20 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
25c30 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
25c40 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
25c50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25c60 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
25c70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25c80 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
25c90 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
25ca0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
25cb0 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
25cc0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
25cd0 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
25ce0 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
25cf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25d00 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
25d10 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
25d20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
25d30 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
25d40 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b  k(pDbFd, F_RDLCK
25d50 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
25d60 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
25d70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
25d80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25d90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
25da0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63    /* Get the loc
25db0 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  al shared locks 
25dc0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
25dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25de0 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
25df0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  |= mask;.    }. 
25e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
25e10 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c  ake sure no sibl
25e20 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
25e30 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20  hold locks that 
25e40 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a  will block this.
25e50 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66      ** lock.  If
25e60 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20   any do, return 
25e70 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68  SQLITE_BUSY righ
25e80 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20  t away..    */. 
25e90 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
25ea0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
25eb0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
25ec0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
25ed0 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
25ee0 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64  0 || (pX->shared
25ef0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
25f00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
25f10 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
25f20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25f30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
25f40 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
25f50 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
25f60 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
25f70 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
25f80 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
25f90 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
25fa0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
25fb0 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
25fc0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
25fd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25fe0 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
25ff0 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
26000 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_WRLCK, ofst+UN
26010 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
26020 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26040 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
26050 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
26060 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
26070 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
26080 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
26090 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
260a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
260b0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
260c0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
260d0 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
260e0 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
260f0 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
26100 20 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70     p->id, osGetp
26110 69 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65 64  id(0), p->shared
26120 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73  Mask, p->exclMas
26130 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  k));.  return rc
26140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
26150 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61  ment a memory ba
26160 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20  rrier or memory 
26170 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20  fence on shared 
26180 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20  memory.  .**.** 
26190 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74  All loads and st
261a0 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72  ores begun befor
261b0 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75  e the barrier mu
261c0 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f  st complete befo
261d0 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f  re.** any load o
261e0 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66  r store begun af
261f0 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e  ter the barrier.
26200 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26210 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a  unixShmBarrier(.
26220 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
26230 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fd              
26240 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
26250 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
26260 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
26270 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
26280 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c  METER(fd);.  sql
26290 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65  ite3MemoryBarrie
262a0 72 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  r();         /* 
262b0 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64  compiler-defined
262c0 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
262d0 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
262e0 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 20 20  tex();          
262f0 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74       /* Also mut
26300 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e  ex, for redundan
26310 63 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61 76  cy */.  unixLeav
26320 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
26330 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65  ** Close a conne
26340 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
26350 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20  memory.  Delete 
26360 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a  the underlying .
26370 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
26380 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
26390 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
263a0 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65   is no shared me
263b0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
263c0 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74  with the connect
263d0 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ion then this.**
263e0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61   routine is a ha
263f0 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f  rmless no-op..*/
26400 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
26410 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
26420 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
26430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26440 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
26450 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
26460 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20   int deleteFlag 
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65   /* Delete share
26490 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65  d-memory if true
264a0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d   */.){.  unixShm
264b0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
264c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
264d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
264e0 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69   closed */.  uni
264f0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
26500 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
26510 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
26520 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
26530 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  e */.  unixShm *
26540 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pp;            
26550 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
26560 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
26570 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
26580 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  /.  unixFile *pD
26590 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  bFd;            
265a0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
265b0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
265c0 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20  ile */..  pDbFd 
265d0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
265e0 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
265f0 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
26600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26610 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
26620 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
26630 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
26640 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
26650 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
26660 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
26670 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
26680 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20  pInode );..  /* 
26690 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
266a0 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
266b0 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
266c0 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
266d0 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
266e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
266f0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
26700 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
26710 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
26720 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
26730 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
26740 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
26750 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
26760 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
26770 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
26780 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
26790 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
267a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
267b0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
267c0 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
267d0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
267e0 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
267f0 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
26800 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
26810 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
26820 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72  o */.  unixEnter
26830 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
26840 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
26850 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
26860 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
26870 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
26880 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  =0 ){.    if( de
26890 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d  leteFlag && pShm
268a0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
268b0 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68      osUnlink(pSh
268c0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
268d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69  );.    }.    uni
268e0 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
268f0 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
26900 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
26910 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26920 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ...#else.# defin
26930 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20  e unixShmMap    
26940 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
26950 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
26960 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72  efine unixShmBar
26970 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
26980 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30  unixShmUnmap   0
26990 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
269a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
269b0 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54  AL */..#if SQLIT
269c0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
269d0 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  0./*.** If it is
269e0 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72   currently memor
269f0 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70 20  y mapped, unmap 
26a00 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61  file pFd..*/.sta
26a10 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d  tic void unixUnm
26a20 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
26a30 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74 28  *pFd){.  assert(
26a40 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
26a50 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d  =0 );.  if( pFd-
26a60 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20  >pMapRegion ){. 
26a70 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64 2d     osMunmap(pFd-
26a80 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46 64  >pMapRegion, pFd
26a90 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
26aa0 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70  );.    pFd->pMap
26ab0 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20  Region = 0;.    
26ac0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
26ad0 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  0;.    pFd->mmap
26ae0 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a  SizeActual = 0;.
26af0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
26b00 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20  empt to set the 
26b10 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  size of the memo
26b20 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e 74  ry mapping maint
26b30 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a 2a  ained by file .*
26b40 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 64  * descriptor pFd
26b50 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e 20   to nNew bytes. 
26b60 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70  Any existing map
26b70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72 64 65  ping is discarde
26b80 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
26b90 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e  essful, this fun
26ba0 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 66  ction sets the f
26bb0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
26bc0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
26bd0 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65 67  unixFile.pMapReg
26be0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69  ion.**       uni
26bf0 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a  xFile.mmapSize.*
26c00 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  *       unixFile
26c10 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 0a  .mmapSizeActual.
26c20 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63 65  **.** If unsucce
26c30 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72 20  ssful, an error 
26c40 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67 65  message is logge
26c50 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f  d via sqlite3_lo
26c60 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74  g() and.** the t
26c70 68 72 65 65 20 76 61 72 69 61 62 6c 65 73 20 61  hree variables a
26c80 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  bove are zeroed.
26c90 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 53 51   In this case SQ
26ca0 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 63  Lite should.** c
26cb0 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69 6e  ontinue accessin
26cc0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  g the database u
26cd0 73 69 6e 67 20 74 68 65 20 78 52 65 61 64 28 29  sing the xRead()
26ce0 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a 2a   and xWrite().**
26cf0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
26d00 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65 6d  tic void unixRem
26d10 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46 69  apfile(.  unixFi
26d20 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20 20  le *pFd,        
26d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
26d40 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62 6a  e descriptor obj
26d50 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65  ect */.  i64 nNe
26d60 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
26d70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
26d80 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69 7a  ired mapping siz
26d90 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
26da0 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d 6d  char *zErr = "mm
26db0 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20 70  ap";.  int h = p
26dc0 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20 20  Fd->h;          
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26de0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
26df0 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20 2a  pen on db file *
26e00 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d 20  /.  u8 *pOrig = 
26e10 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
26e20 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e  egion;   /* Poin
26e30 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 66  ter to current f
26e40 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20  ile mapping */. 
26e50 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46 64   i64 nOrig = pFd
26e60 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
26e70 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
26e80 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69 6e   pOrig region in
26e90 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a   bytes */.  u8 *
26ea0 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  pNew = 0;       
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ec0 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20   /* Location of 
26ed0 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20  new mapping */. 
26ee0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52 4f   int flags = PRO
26ef0 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20 20  T_READ;         
26f00 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
26f10 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28 29  o pass to mmap()
26f20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
26f30 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
26f40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
26f50 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ew>pFd->mmapSize
26f60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
26f70 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ew<=pFd->mmapSiz
26f80 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65 72 74  eMax );.  assert
26f90 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61 73  ( nNew>0 );.  as
26fa0 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70 53  sert( pFd->mmapS
26fb0 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d 3e  izeActual>=pFd->
26fc0 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73  mmapSize );.  as
26fd0 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c 45 44  sert( MAP_FAILED
26fe0 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  !=0 );..#ifdef S
26ff0 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57  QLITE_MMAP_READW
27000 52 49 54 45 0a 20 20 69 66 28 20 28 70 46 64 2d  RITE.  if( (pFd-
27010 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
27020 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30  XFILE_RDONLY)==0
27030 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54   ) flags |= PROT
27040 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 0a  _WRITE;.#endif..
27050 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23    if( pOrig ){.#
27060 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
27070 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20     i64 nReuse = 
27080 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23  pFd->mmapSize;.#
27090 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
270a0 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f  nt szSyspage = o
270b0 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a  sGetpagesize();.
270c0 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d      i64 nReuse =
270d0 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20   (pFd->mmapSize 
270e0 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29  & ~(szSyspage-1)
270f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38  );.#endif.    u8
27100 20 2a 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b   *pReq = &pOrig[
27110 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a  nReuse];..    /*
27120 20 55 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73   Unmap any pages
27130 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67   of the existing
27140 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 63 61   mapping that ca
27150 6e 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20  nnot be reused. 
27160 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73  */.    if( nReus
27170 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  e!=nOrig ){.    
27180 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c    osMunmap(pReq,
27190 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a   nOrig-nReuse);.
271a0 20 20 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f      }..#if HAVE_
271b0 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20  MREMAP.    pNew 
271c0 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67  = osMremap(pOrig
271d0 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20  , nReuse, nNew, 
271e0 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b  MREMAP_MAYMOVE);
271f0 0a 20 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65  .    zErr = "mre
27200 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20  map";.#else.    
27210 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52  pNew = osMmap(pR
27220 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c  eq, nNew-nReuse,
27230 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52   flags, MAP_SHAR
27240 45 44 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a  ED, h, nReuse);.
27250 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41      if( pNew!=MA
27260 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
27270 20 20 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71    if( pNew!=pReq
27280 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75   ){.        osMu
27290 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20  nmap(pNew, nNew 
272a0 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20  - nReuse);.     
272b0 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
272c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
272d0 20 20 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a    pNew = pOrig;.
272e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
272f0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
27300 20 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65   attempt to exte
27310 6e 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  nd the existing 
27320 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20  mapping failed. 
27330 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  Free it. */.    
27340 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41  if( pNew==MAP_FA
27350 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20  ILED || pNew==0 
27360 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  ){.      osMunma
27370 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29  p(pOrig, nReuse)
27380 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
27390 2a 20 49 66 20 70 4e 65 77 20 69 73 20 73 74 69  * If pNew is sti
273a0 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20  ll NULL, try to 
273b0 63 72 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65  create an entire
273c0 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20  ly new mapping. 
273d0 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
273e0 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f   ){.    pNew = o
273f0 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66  sMmap(0, nNew, f
27400 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44  lags, MAP_SHARED
27410 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , h, 0);.  }..  
27420 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41  if( pNew==MAP_FA
27430 49 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77  ILED ){.    pNew
27440 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d   = 0;.    nNew =
27450 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45   0;.    unixLogE
27460 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20  rror(SQLITE_OK, 
27470 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68  zErr, pFd->zPath
27480 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
27490 65 20 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66  e mmap() above f
274a0 61 69 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ailed, assume th
274b0 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  at all subsequen
274c0 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20  t mmap() calls. 
274d0 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61     ** will proba
274e0 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61  bly fail too. Fa
274f0 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67  ll back to using
27500 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 65 78   xRead/xWrite ex
27510 63 6c 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a  clusively.    **
27520 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
27530 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  */.    pFd->mmap
27540 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d  SizeMax = 0;.  }
27550 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  .  pFd->pMapRegi
27560 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65  on = (void *)pNe
27570 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  w;.  pFd->mmapSi
27580 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ze = pFd->mmapSi
27590 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b  zeActual = nNew;
275a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79  .}../*.** Memory
275b0 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68   map or remap th
275c0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  e file opened by
275d0 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
275e0 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c   pFd (if the fil
275f0 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20  e.** is already 
27600 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73  mapped, the exis
27610 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
27620 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
27630 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a  new). Or, if .**
27640 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
27650 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
27660 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
27670 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
27680 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69  ll .** outstandi
27690 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65  ng xFetch() refe
276a0 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68  rences to it, th
276b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
276c0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
276d0 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65   parameter nByte
276e0 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
276f0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
27700 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
27710 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69  of .** the mappi
27720 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74  ng to create. Ot
27730 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74  herwise, if nByt
27740 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
27750 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ero, then the .*
27760 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
27770 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
27780 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
27790 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
277a0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
277b0 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
277c0 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
277d0 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
277e0 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
277f0 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54   .** using SQLIT
27800 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d  E_FCNTL_MMAP_LIM
27810 49 54 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  IT, whichever is
27820 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   smaller..**.** 
27830 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
27840 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
27850 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69  r occurs (even i
27860 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  f the mapping is
27870 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65   not.** recreate
27880 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  d as a result of
27890 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
278a0 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53  erences) or an S
278b0 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
278c0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
278d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
278e0 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  xMapfile(unixFil
278f0 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 4d 61 70  e *pFd, i64 nMap
27900 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ){.  assert( nMa
27910 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
27920 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61  tchOut==0 );.  a
27930 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c  ssert( nMap>0 ||
27940 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d   (pFd->mmapSize=
27950 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70 52  =0 && pFd->pMapR
27960 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69  egion==0) );.  i
27970 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  f( pFd->nFetchOu
27980 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
27990 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e  ITE_OK;..  if( n
279a0 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72  Map<0 ){.    str
279b0 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
279c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
279d0 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66  w-level file inf
279e0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
279f0 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 64 2d  if( osFstat(pFd-
27a00 3e 68 2c 20 26 73 74 61 74 62 75 66 29 20 29 7b  >h, &statbuf) ){
27a10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
27a20 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
27a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70  ;.    }.    nMap
27a40 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69   = statbuf.st_si
27a50 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  ze;.  }.  if( nM
27a60 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
27a70 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
27a80 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
27a90 61 78 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ax;.  }..  asser
27aa0 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46  t( nMap>0 || (pF
27ab0 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26  d->mmapSize==0 &
27ac0 26 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  & pFd->pMapRegio
27ad0 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 6e  n==0) );.  if( n
27ae0 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  Map!=pFd->mmapSi
27af0 7a 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 52 65  ze ){.    unixRe
27b00 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d 61  mapfile(pFd, nMa
27b10 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  p);.  }..  retur
27b20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
27b30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
27b40 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
27b50 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
27b60 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
27b70 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
27b80 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
27b90 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
27ba0 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
27bb0 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
27bc0 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
27bd0 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
27be0 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
27bf0 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
27c00 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
27c10 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
27c20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
27c30 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
27c40 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
27c50 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
27c60 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
27c70 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
27c80 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
27c90 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
27ca0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
27cb0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
27cc0 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
27cd0 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
27ce0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
27cf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
27d00 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
27d10 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
27d20 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
27d30 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
27d40 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
27d50 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75  nce by calling u
27d60 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f  nixUnfetch()..*/
27d70 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27d80 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
27d90 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
27da0 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
27db0 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
27dc0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
27dd0 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
27de0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
27df0 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
27e00 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
27e10 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
27e20 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66  .  *pp = 0;..#if
27e30 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27e40 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
27e50 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  d->mmapSizeMax>0
27e60 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d   ){.    if( pFd-
27e70 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  >pMapRegion==0 )
27e80 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
27e90 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64   unixMapfile(pFd
27ea0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  , -1);.      if(
27eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27ed0 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
27ee0 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
27ef0 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
27f00 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
27f10 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
27f20 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
27f30 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
27f40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
27f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
27f70 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
27f80 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
27f90 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27fa0 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
27fb0 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
27fc0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
27fd0 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63  call to unixFetc
27fe0 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
27ff0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
28000 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
28010 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
28020 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
28030 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
28040 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
28050 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69  assed to the uni
28060 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  xFetch() invocat
28070 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ion. .**.** Or, 
28080 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  if the third arg
28090 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
280a0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
280b0 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
280c0 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  d .** to inform 
280d0 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
280e0 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
280f0 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
28100 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a  ting mapping .**
28110 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61   may now be inva
28120 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
28130 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73  e unmapped..*/.s
28140 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
28150 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  fetch(sqlite3_fi
28160 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
28170 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20  , void *p){.#if 
28180 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
28190 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c  SIZE>0.  unixFil
281a0 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
281b0 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  le *)fd;   /* Th
281c0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
281d0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
281e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
281f0 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66  (iOff);..  /* If
28200 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
28210 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
28220 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
28230 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
28240 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
28250 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
28260 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
28270 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
28280 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
28290 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
282a0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
282b0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
282c0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
282d0 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
282e0 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
282f0 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
28300 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
28310 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
28320 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
28330 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
28340 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
28350 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
28360 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
28370 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
28380 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  nixUnmapfile(pFd
28390 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
283a0 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
283b0 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55  >=0 );.#else.  U
283c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
283d0 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
283e0 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e  RAMETER(p);.  UN
283f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
28400 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  Off);.#endif.  r
28410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
28430 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
28440 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
28450 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
28460 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
28470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
28480 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
28490 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
284a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284b0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
284c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28500 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
28510 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
28520 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
28530 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
28540 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
28550 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
28560 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
28570 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
28580 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
28590 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
285a0 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
285b0 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
285c0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
285d0 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
285e0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
285f0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
28600 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
28610 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
28620 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
28630 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
28640 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
28650 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
28660 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
28670 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
28680 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
28690 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
286a0 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
286b0 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
286c0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
286d0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
286e0 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
286f0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
28700 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
28710 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
28720 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
28730 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
28740 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
28750 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
28760 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
28770 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
28780 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
28790 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
287a0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
287b0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20  der-function F, 
287c0 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20  two objects are 
287d0 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
287e0 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66    (1) The real f
287f0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e  inder-function n
28800 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a  amed "FImpt()"..
28810 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63  **.**    (2) A c
28820 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20  onstant pointer 
28830 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
28840 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e   named just "F".
28850 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .**.**.** A poin
28860 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69  ter to the F poi
28870 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20  nter is used as 
28880 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c  the pAppData val
28890 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62  ue for VFS.** ob
288a0 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20  jects.  We have 
288b0 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65  to do this inste
288c0 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41  ad of letting pA
288d0 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20  ppData point.** 
288e0 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20  directly at the 
288f0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
28900 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20  since C90 rules 
28910 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a  prevent a void*.
28920 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20  ** from be cast 
28930 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  into a function 
28940 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a  pointer..**.**.*
28950 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
28960 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
28970 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
28980 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
28990 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
289a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
289b0 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
289c0 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
289d0 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
289e0 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
289f0 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
28a00 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
28a10 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
28a20 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
28a30 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
28a40 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
28a50 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
28a60 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
28a70 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
28a80 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
28a90 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
28aa0 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e 2c  ,METHOD,VERSION,
28ab0 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43  CLOSE,LOCK,UNLOC
28ac0 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29  K,CKLOCK,SHMMAP)
28ad0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
28ae0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
28af0 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
28b00 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e      \.   VERSION
28b30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28b40 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
28b50 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28be0 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c10 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
28c70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
28c80 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28cb0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cd0 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28d00 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
28d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d20 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
28d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28d50 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28d70 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28da0 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
28db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28dc0 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28df0 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
28e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28e10 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28e20 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
28e30 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28e40 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
28e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
28e60 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e80 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28e90 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
28ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
28eb0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28ee0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
28ef0 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
28f00 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
28f10 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28f20 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d         \.   SHMM
28f30 41 50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  AP,             
28f40 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
28f50 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f70 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
28f80 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
28f90 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
28fa0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fc0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
28fd0 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
28fe0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
28ff0 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rier */         
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29010 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
29020 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
29030 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
29040 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63     \.   unixFetc
29070 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
29080 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74    \.   unixUnfet
290c0 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
290d0 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
290e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29100 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20   \.};           
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29150 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
29160 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29170 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28  s *FINDER##Impl(
29180 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75  const char *z, u
29190 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c  nixFile *p){   \
291a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
291b0 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50  TER(z); UNUSED_P
291c0 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20  ARAMETER(p);    
291d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
291f0 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44    return &METHOD
29200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29230 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
29240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29280 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
29290 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
292a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
292b0 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63  *const FINDER)(c
292c0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
292d0 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20  ile *p)    \.   
292e0 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b   = FINDER##Impl;
292f0 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65  ../*.** Here are
29300 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69   all of the sqli
29310 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29320 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
29330 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  of the.** lockin
29340 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46  g strategies.  F
29350 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65  unctions that re
29360 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  turn pointers to
29370 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a   these methods.*
29380 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74  * are also creat
29390 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53  ed..*/.IOMETHODS
293a0 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65  (.  posixIoFinde
293b0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
293c0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
293d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78   name */.  posix
293e0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
293f0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
29400 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
29410 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20  t name */.  3,  
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29430 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
29440 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20  memory and mmap 
29450 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  are enabled */. 
29460 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
29470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
29480 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
29490 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
294a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
294b0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
294c0 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
294d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
294e0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
294f0 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
29500 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43  edLock,    /* xC
29510 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29520 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
29530 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20  xShmMap         
29540 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
29550 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  p method */.).IO
29560 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63  METHODS(.  noloc
29570 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
29580 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
29590 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
295a0 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64    nolockIoMethod
295b0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  s,          /* s
295c0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
295d0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
295e0 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29600 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
29610 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e   disabled */.  n
29620 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  olockClose,     
29630 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29640 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  se method */.  n
29650 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  olockLock,      
29660 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29670 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
29680 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
29690 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
296a0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
296b0 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
296c0 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68 65  edLock,  /* xChe
296d0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
296e0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29700 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
29710 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
29720 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b  THODS(.  dotlock
29730 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29740 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
29750 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
29760 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
29770 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ,         /* sql
29780 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29790 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
297a0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
297b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
297c0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
297d0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74  isabled */.  dot
297e0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
297f0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
29800 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
29810 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
29820 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29830 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
29840 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
29850 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29860 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
29870 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
29880 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63 6b  dLock, /* xCheck
29890 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
298a0 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
298b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298c0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
298d0 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
298e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
298f0 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
29900 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46  HODS(.  flockIoF
29910 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29920 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
29930 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  tion name */.  f
29940 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
29950 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
29960 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29970 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
29980 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
29990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
299a0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
299b0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63  sabled */.  floc
299c0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
299d0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
299e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
299f0 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
29a00 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29a10 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
29a20 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29a30 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29a40 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
29a50 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
29a60 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck,   /* xCheckR
29a70 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
29a80 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29aa0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
29ab0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
29ac0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
29ad0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
29ae0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29af0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
29b00 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
29b10 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
29b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
29b30 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29b40 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
29b50 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
29b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b70 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
29b80 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
29b90 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20 20   semXClose,     
29ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
29bb0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
29bc0 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20 20   semXLock,      
29bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
29be0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29bf0 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  semXUnlock,     
29c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
29c10 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
29c20 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76   semXCheckReserv
29c30 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43  edLock,    /* xC
29c40 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29c50 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c70 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
29c80 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
29c90 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
29ca0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
29cb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29cc0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
29cd0 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69  THODS(.  afpIoFi
29ce0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
29cf0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
29d00 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
29d10 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  afpIoMethods,   
29d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
29d30 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29d40 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29d50 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
29d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29d70 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
29d80 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70  isabled */.  afp
29d90 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
29da0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
29db0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
29dc0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
29dd0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29de0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55  method */.  afpU
29df0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
29e00 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29e10 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
29e20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29e30 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
29e40 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29e50 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e70 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
29e80 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
29e90 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
29ea0 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  y locking method
29eb0 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74   is a "super-met
29ec0 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73  hod" in the sens
29ed0 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65  e that it.** ope
29ee0 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ns secondary fil
29ef0 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
29f00 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20  r the conch and 
29f10 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a  lock files and.*
29f20 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c  * it uses proxy,
29f30 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20   dot-file, AFP, 
29f40 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  and flock() lock
29f50 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74  ing methods on t
29f60 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72  hose.** secondar
29f70 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68  y files.  For th
29f80 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
29f90 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
29fa0 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79  lements.** proxy
29fb0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61   locking is loca
29fc0 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72  ted much further
29fd0 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c   down in the fil
29fe0 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a  e.  But we need.
29ff0 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61  ** to go ahead a
2a000 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71  nd define the sq
2a010 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a020 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63   and finder func
2a030 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78  tion.** for prox
2a040 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20  y locking here. 
2a050 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64   So we forward d
2a060 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d  eclare the I/O m
2a070 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64  ethods..*/.#if d
2a080 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2a090 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2a0a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a0b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2a0c0 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  yClose(sqlite3_f
2a0d0 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ile*);.static in
2a0e0 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69  t proxyLock(sqli
2a0f0 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
2a100 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2a110 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  yUnlock(sqlite3_
2a120 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
2a130 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65  tic int proxyChe
2a140 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
2a150 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
2a160 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  t*);.IOMETHODS(.
2a170 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c    proxyIoFinder,
2a180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2a190 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2a1a0 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f  ame */.  proxyIo
2a1b0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2a1c0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2a1d0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2a1e0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a200 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2a210 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2a220 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65   */.  proxyClose
2a230 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a240 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2a250 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c   */.  proxyLock,
2a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a270 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2a280 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b  */.  proxyUnlock
2a290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2a2a0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2a2b0 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b   */.  proxyCheck
2a2c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
2a2d0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2a2e0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2a2f0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2a300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a310 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2a320 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66  .).#endif../* nf
2a330 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31  s lockd on OSX 1
2a340 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65  0.3+ doesn't cle
2a350 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77  ar write locks w
2a360 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
2a370 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65  is set */.#if de
2a380 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2a390 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2a3a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2a3b0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73  IOMETHODS(.  nfs
2a3c0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2a3d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2a3e0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2a3f0 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64  */.  nfsIoMethod
2a400 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2a410 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
2a420 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
2a430 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2a460 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2a470 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
2a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a490 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2a4a0 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
2a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4c0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2a4d0 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20  */.  nfsUnlock, 
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4f0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2a500 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
2a510 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
2a520 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2a530 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2a540 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a560 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2a570 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
2a580 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2a590 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2a5a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2a5b0 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
2a5c0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
2a5d0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
2a5e0 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
2a5f0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
2a600 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
2a610 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
2a620 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
2a630 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
2a640 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
2a650 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
2a660 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
2a670 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
2a680 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53  his is for MacOS
2a690 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  X only..*/.stati
2a6a0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2a6b0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
2a6c0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2a6d0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2a6e0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
2a6f0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
2a700 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
2a710 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
2a720 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20          /* open 
2a730 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  file object for 
2a740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a750 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63  e */.){.  static
2a760 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61   const struct Ma
2a770 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73  pping {.    cons
2a780 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73  t char *zFilesys
2a790 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  tem;            
2a7a0 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20    /* Filesystem 
2a7b0 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  type name */.   
2a7c0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a7d0 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
2a7e0 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70  ods;   /* Approp
2a7f0 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  riate locking me
2a800 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70  thod */.  } aMap
2a810 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66  [] = {.    { "hf
2a820 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
2a830 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2a840 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "ufs",    &posix
2a850 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2a860 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66   { "afpfs",  &af
2a870 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
2a880 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61    { "smbfs",  &a
2a890 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
2a8a0 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26     { "webdav", &
2a8b0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  nolockIoMethods 
2a8c0 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  },.    { 0, 0 }.
2a8d0 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
2a8e0 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
2a8f0 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66  Info;.  struct f
2a900 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
2a910 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
2a920 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
2a930 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
2a940 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
2a950 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
2a960 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
2a970 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
2a980 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
2a990 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
2a9a0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
2a9b0 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ds;.  }.  if( st
2a9c0 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
2a9d0 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b  fsInfo) != -1 ){
2a9e0 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e  .    if( fsInfo.
2a9f0 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
2aa00 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65  ONLY ){.      re
2aa10 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2aa20 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20  thods;.    }.   
2aa30 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69   for(i=0; aMap[i
2aa40 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69  ].zFilesystem; i
2aa50 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
2aa60 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
2aa70 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b  stypename, aMap[
2aa80 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d  i].zFilesystem)=
2aa90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
2aaa0 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65  turn aMap[i].pMe
2aab0 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20  thods;.      }. 
2aac0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
2aad0 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e  efault case. Han
2aae0 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74  dles, amongst ot
2aaf0 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a  hers, "nfs"..  *
2ab00 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * Test byte-rang
2ab10 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
2ab20 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c  tl(). If the cal
2ab30 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a  l succeeds, .  *
2ab40 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
2ab50 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
2ab60 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79  pports POSIX sty
2ab70 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a  le locks. .  */.
2ab80 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
2ab90 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
2aba0 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
2abb0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
2abc0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
2abd0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
2abe0 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
2abf0 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
2ac00 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
2ac10 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
2ac20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
2ac30 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2ac40 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20  , "nfs")==0 ){. 
2ac50 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73       return &nfs
2ac60 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2ac70 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65   else {.      re
2ac80 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
2ac90 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  hods;.    }.  }e
2aca0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2acb0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2acc0 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
2acd0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2ace0 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
2acf0 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  onst autolockIoF
2ad00 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
2ad10 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
2ad20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2ad30 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
2ad40 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2ad50 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2ad60 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2ad70 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58  LE */..#if OS_VX
2ad80 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  WORKS./*.** This
2ad90 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
2ada0 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73 20 63  on for VxWorks c
2adb0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
2adc0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 0a 2a  posix advisory.*
2add0 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 2e  * locking works.
2ade0 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68    If it does, th
2adf0 65 6e 20 74 68 61 74 20 69 73 20 77 68 61 74 20  en that is what 
2ae00 69 73 20 75 73 65 64 2e 20 20 49 66 20 69 74 20  is used.  If it 
2ae10 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b  does not.** work
2ae20 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b 20  , then fallback 
2ae30 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  to named semapho
2ae40 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  re locking..*/.s
2ae50 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2ae60 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2ae70 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49  vxworksIoFinderI
2ae80 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
2ae90 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
2aea0 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
2aeb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2aec0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2aed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
2aee0 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  e open file obje
2aef0 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ct */.){.  struc
2af00 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
2af10 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
2af20 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
2af30 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
2af40 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
2af50 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2af60 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
2af70 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
2af80 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
2af90 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
2afa0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2afb0 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  thods;.  }..  /*
2afc0 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29   Test if fcntl()
2afd0 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e   is supported an
2afe0 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c  d use POSIX styl
2aff0 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74  e locks..  ** Ot
2b000 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63  herwise fall bac
2b010 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73  k to the named s
2b020 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e  emaphore method.
2b030 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
2b040 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
2b050 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
2b060 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
2b070 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
2b080 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
2b090 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
2b0a0 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
2b0b0 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
2b0c0 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
2b0d0 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  ) {.    return &
2b0e0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
2b0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2b100 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64  urn &semIoMethod
2b110 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
2b120 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2b130 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
2b140 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f 46 69  onst vxworksIoFi
2b150 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
2b160 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 76  *,unixFile*) = v
2b170 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d  xworksIoFinderIm
2b180 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  pl;..#endif /* O
2b190 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a  S_VXWORKS */../*
2b1a0 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20  .** An abstract 
2b1b0 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74  type for a point
2b1c0 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68  er to an IO meth
2b1d0 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
2b1e0 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63  on:.*/.typedef c
2b1f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2b200 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65  methods *(*finde
2b210 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68  r_type)(const ch
2b220 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a  ar*,unixFile*);.
2b230 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2b240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2b280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
2b2a0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
2b2b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2b2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2b2d0 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
2b2e0 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
2b2f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2b300 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
2b310 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
2b320 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  bject..*/../*.**
2b330 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2b340 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b350 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
2b360 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
2b370 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pId..*/.static 
2b380 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  int fillInUnixFi
2b390 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  le(.  sqlite3_vf
2b3a0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
2b3b0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
2b3c0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
2b3d0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
2b3e0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
2b3f0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
2b400 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2b410 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
2b420 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
2b430 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e   Write to the un
2b440 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2b450 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2b460 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2b470 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
2b480 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
2b490 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ned */.  int ctr
2b4a0 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
2b4b0 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65   /* Zero or more
2b4c0 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75   UNIXFILE_* valu
2b4d0 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
2b4e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2b4f0 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79  ods *pLockingSty
2b500 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
2b510 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
2b520 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
2b530 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2b540 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
2b550 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  Inode==NULL );..
2b560 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65    /* Usually the
2b570 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20   path zFilename 
2b580 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
2b590 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2b5a0 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65  e. The.  ** exce
2b5b0 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70  ption is when op
2b5c0 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20  ening the proxy 
2b5d0 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20  "conch" file in 
2b5e0 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a  builds that.  **
2b5f0 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65   include the spe
2b600 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69  cial Apple locki
2b610 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a  ng styles..  */.
2b620 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2b630 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2b640 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2b650 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20  STYLE.  assert( 
2b660 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
2b670 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
2b680 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e  ' .    || pVfs->
2b690 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a  pAppData==(void*
2b6a0 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
2b6b0 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73  er );.#else.  as
2b6c0 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
2b6d0 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
2b6e0 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69  0]=='/' );.#endi
2b6f0 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69  f..  /* No locki
2b700 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d  ng occurs in tem
2b710 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a  porary files */.
2b720 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2b730 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46  ame!=0 || (ctrlF
2b740 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2b750 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20  NOLOCK)!=0 );.. 
2b760 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
2b770 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
2b780 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
2b790 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
2b7a0 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66  pNew->pVfs = pVf
2b7b0 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68  s;.  pNew->zPath
2b7c0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
2b7d0 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2b7e0 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b  = (u8)ctrlFlags;
2b7f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
2b800 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e  MMAP_SIZE>0.  pN
2b810 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  ew->mmapSizeMax 
2b820 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2b830 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
2b840 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
2b850 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
2b860 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2b870 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
2b880 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
2b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8a0 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
2b8b0 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
2b8c0 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
2b8d0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2b8e0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
2b8f0 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  SOW;.  }.  if( s
2b900 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  trcmp(pVfs->zNam
2b910 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d  e,"unix-excl")==
2b920 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
2b930 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2b940 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a  FILE_EXCL;.  }..
2b950 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2b960 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
2b970 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
2b980 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
2b990 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
2b9a0 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c  .    ctrlFlags |
2b9b0 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
2b9c0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
2b9d0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2b9e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2b9f0 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49   ctrlFlags & UNI
2ba00 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a  XFILE_NOLOCK ){.
2ba10 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
2ba20 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  e = &nolockIoMet
2ba30 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2ba40 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
2ba50 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79   = (**(finder_ty
2ba60 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61  pe*)pVfs->pAppDa
2ba70 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ta)(zFilename, p
2ba80 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  New);.#if SQLITE
2ba90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2baa0 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
2bab0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
2bac0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
2bad0 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
2bae0 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
2baf0 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
2bb00 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
2bb10 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
2bb20 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
2bb30 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
2bb40 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
2bb50 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2bb60 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
2bb70 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
2bb80 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2bb90 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
2bba0 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
2bbb0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
2bbc0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2bbd0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2bbe0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2bbf0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2bc00 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2bc10 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c  _STYLE.    || pL
2bc20 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2bc30 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e  nfsIoMethods.#en
2bc40 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69  dif.  ){.    uni
2bc50 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2bc60 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
2bc70 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
2bc80 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
2bc90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bca0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  K ){.      /* If
2bcb0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2bcc0 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49  ed in findInodeI
2bcd0 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65  nfo(), close the
2bce0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2bcf0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  .      ** immedi
2bd00 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65  ately, before re
2bd10 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  leasing the mute
2bd20 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  x. findInodeInfo
2bd30 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20  () may fail.    
2bd40 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e    ** in two scen
2bd50 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  arios:.      **.
2bd60 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41        **   (a) A
2bd70 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29   call to fstat()
2bd80 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2bd90 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63  *   (b) A malloc
2bda0 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2bdb0 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61  *.      ** Scena
2bdc0 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79  rio (b) may only
2bdd0 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72   occur if the pr
2bde0 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
2bdf0 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20   no other.      
2be00 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
2be10 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
2be20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68  same file. If th
2be30 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66  ere were other f
2be40 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
2be50 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73  criptors on this
2be60 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d   file, then no m
2be70 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72  alloc would be r
2be80 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2be90 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   ** findInodeInf
2bea0 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20  o(). If this is 
2beb0 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20  the case, it is 
2bec0 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c  quite safe to cl
2bed0 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ose.      ** han
2bee0 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73  dle h - as it is
2bef0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
2bf00 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20   no posix locks 
2bf10 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64  will be released
2bf20 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69  .      ** by doi
2bf30 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a  ng so..      **.
2bf40 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e        ** If scen
2bf50 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20  ario (a) caused 
2bf60 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74  the error then t
2bf70 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f  hings are not so
2bf80 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20   safe. The.     
2bf90 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73   ** implicit ass
2bfa0 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20  umption here is 
2bfb0 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20  that if fstat() 
2bfc0 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72  fails, things ar
2bfd0 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75  e in.      ** su
2bfe0 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61  ch bad shape tha
2bff0 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63  t dropping a loc
2c000 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74  k or two doesn't
2c010 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20   matter much..  
2c020 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62      */.      rob
2c030 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2c040 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2c050 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2c060 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2c070 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66  utex();.  }..#if
2c080 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2c090 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2c0a0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2c0b0 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  _).  else if( pL
2c0c0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2c0d0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
2c0e0 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69      /* AFP locki
2c0f0 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2c100 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2c110 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
2c120 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61   in.    ** the a
2c130 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2c140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70  ..    */.    afp
2c150 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2c160 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pCtx;.    pNew->
2c170 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2c180 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
2c190 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
2c1a0 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
2c1b0 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
2c1c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c1d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2c1e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2c1f0 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78  NB: zFilename ex
2c200 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73  ists and remains
2c210 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
2c220 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a   file is closed.
2c230 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69        ** accordi
2c240 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e  ng to requiremen
2c250 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65  t F11141.  So we
2c260 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
2c270 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  make a.      ** 
2c280 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
2c290 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  name. */.      p
2c2a0 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46  Ctx->dbPath = zF
2c2b0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ilename;.      p
2c2c0 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  Ctx->reserved = 
2c2d0 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  0;.      srandom
2c2e0 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69  dev();.      uni
2c2f0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2c300 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e       rc = findIn
2c310 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
2c320 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
2c330 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c350 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
2c360 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2c370 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  xt);.        rob
2c380 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2c390 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2c3a0 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
2c3b0 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78      }.      unix
2c3c0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20  LeaveMutex();   
2c3d0 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
2c3e0 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69  #endif..  else i
2c3f0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2c400 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
2c410 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2c420 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
2c430 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
2c440 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
2c450 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
2c460 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c  .    ** the dotl
2c470 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
2c480 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  t .    */.    ch
2c490 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  ar *zLockFile;. 
2c4a0 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
2c4b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46  ;.    assert( zF
2c4c0 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ilename!=0 );.  
2c4d0 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69    nFilename = (i
2c4e0 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  nt)strlen(zFilen
2c4f0 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c  ame) + 6;.    zL
2c500 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
2c510 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
2c520 36 34 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  64(nFilename);. 
2c530 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65     if( zLockFile
2c540 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2c550 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2c560 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
2c570 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2c580 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
2c590 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
2c5a0 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
2c5b0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
2c5c0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
2c5d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
2c5e0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
2c5f0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2c600 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2c610 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
2c620 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2c630 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
2c640 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
2c650 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
2c660 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
2c670 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
2c680 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
2c690 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
2c6a0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2c6b0 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
2c6c0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2c6d0 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2c6e0 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
2c6f0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
2c700 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2c710 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
2c720 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
2c730 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
2c740 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
2c750 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
2c760 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
2c770 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
2c780 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
2c790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c7a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
2c7b0 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
2c7c0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
2c7d0 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
2c7e0 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
2c7f0 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
2c800 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
2c810 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
2c820 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2c830 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
2c840 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
2c850 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
2c860 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
2c870 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
2c880 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
2c890 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2c8a0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2c8b0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
2c8c0 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27  emName[0] = '\0'
2c8d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c8e0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2c8f0 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
2c900 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61 73 74 45  .  .  storeLastE
2c910 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23  rrno(pNew, 0);.#
2c920 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2c930 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c940 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d  K ){.    if( h>=
2c950 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  0 ) robust_close
2c960 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2c970 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b  __);.    h = -1;
2c980 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46  .    osUnlink(zF
2c990 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ilename);.    pN
2c9a0 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
2c9b0 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
2c9c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
2c9d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c9e0 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2c9f0 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2ca00 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2ca10 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  _);.  }else{.   
2ca20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
2ca30 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a   pLockingStyle;.
2ca40 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
2ca50 2b 31 29 3b 0a 20 20 20 20 76 65 72 69 66 79 44  +1);.    verifyD
2ca60 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d  bFile(pNew);.  }
2ca70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ca80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2ca90 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  e name of a dire
2caa0 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74  ctory in which t
2cab0 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20  o put temporary 
2cac0 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20  files..** If no 
2cad0 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61  suitable tempora
2cae0 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72  ry file director
2caf0 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  y can be found, 
2cb00 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
2cb10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2cb20 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44  r *unixTempFileD
2cb30 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ir(void){.  stat
2cb40 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
2cb50 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
2cb60 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20   0,.     0,.    
2cb70 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
2cb80 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
2cb90 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
2cba0 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67  ".".  };.  unsig
2cbb0 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  ned int i = 0;. 
2cbc0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
2cbd0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2cbe0 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 74  zDir = sqlite3_t
2cbf0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a  emp_directory;..
2cc00 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d    if( !azDirs[0]
2cc10 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67   ) azDirs[0] = g
2cc20 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
2cc30 50 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61  PDIR");.  if( !a
2cc40 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72  zDirs[1] ) azDir
2cc50 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[1] = getenv("T
2cc60 4d 50 44 49 52 22 29 3b 0a 20 20 77 68 69 6c 65  MPDIR");.  while
2cc70 28 31 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69  (1){.    if( zDi
2cc80 72 21 3d 30 0a 20 20 20 20 20 26 26 20 6f 73 53  r!=0.     && osS
2cc90 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 3d  tat(zDir, &buf)=
2cca0 3d 30 0a 20 20 20 20 20 26 26 20 53 5f 49 53 44  =0.     && S_ISD
2ccb0 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a  IR(buf.st_mode).
2ccc0 20 20 20 20 20 26 26 20 6f 73 41 63 63 65 73 73       && osAccess
2ccd0 28 7a 44 69 72 2c 20 30 33 29 3d 3d 30 0a 20 20  (zDir, 03)==0.  
2cce0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2ccf0 6e 20 7a 44 69 72 3b 0a 20 20 20 20 7d 0a 20 20  n zDir;.    }.  
2cd00 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
2cd10 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61  azDirs)/sizeof(a
2cd20 7a 44 69 72 73 5b 30 5d 29 20 29 20 62 72 65 61  zDirs[0]) ) brea
2cd30 6b 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  k;.    zDir = az
2cd40 44 69 72 73 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20  Dirs[i++];.  }. 
2cd50 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2cd60 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
2cd70 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
2cd80 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
2cd90 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2cda0 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
2cdb0 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
2cdc0 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
2cdd0 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
2cde0 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
2cdf0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
2ce00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2ce10 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
2ce20 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2ce30 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  f){.  const char
2ce40 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20 69 4c   *zDir;.  int iL
2ce50 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  imit = 0;..  /* 
2ce60 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
2ce70 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
2ce80 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
2ce90 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
2cea0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
2ceb0 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
2cec0 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
2ced0 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
2cee0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
2cef0 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
2cf00 20 2a 2f 0a 20 20 7a 42 75 66 5b 30 5d 20 3d 20   */.  zBuf[0] = 
2cf10 30 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  0;.  SimulateIOE
2cf20 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2cf30 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
2cf40 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
2cf50 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
2cf60 7a 44 69 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  zDir==0 ) return
2cf70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45   SQLITE_IOERR_GE
2cf80 54 54 45 4d 50 50 41 54 48 3b 0a 20 20 64 6f 7b  TTEMPPATH;.  do{
2cf90 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
2cfa0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2cfb0 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72  ss(sizeof(r), &r
2cfc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2cfd0 42 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a 42 75  Buf>2 );.    zBu
2cfe0 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b 0a 20  f[nBuf-2] = 0;. 
2cff0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2d000 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
2d010 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
2d020 5f 46 49 4c 45 5f 50 52 45 46 49 58 22 25 6c 6c  _FILE_PREFIX"%ll
2d030 78 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x%c",.          
2d040 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c             zDir,
2d050 20 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   r, 0);.    if( 
2d060 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d 30 20  zBuf[nBuf-2]!=0 
2d070 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e 31 30  || (iLimit++)>10
2d080 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2d090 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69 6c 65  _ERROR;.  }while
2d0a0 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c  ( osAccess(zBuf,
2d0b0 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
2d0c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2d0d0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2d0e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2d0f0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2d100 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  LE__)./*.** Rout
2d110 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  ine to transform
2d120 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f   a unixFile into
2d130 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67   a proxy-locking
2d140 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d   unixFile..** Im
2d150 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20  plementation in 
2d160 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64  the proxy-lock d
2d170 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65  ivision, but use
2d180 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a  d by unixOpen().
2d190 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45  ** if SQLITE_PRE
2d1a0 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2d1b0 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
2d1c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2d1d0 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2d1e0 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f  le(unixFile*, co
2d1f0 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64  nst char*);.#end
2d200 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  if../*.** Search
2d210 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
2d220 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
2d230 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  hat was opened o
2d240 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
2d250 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  ** file (not a j
2d260 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72  ournal or master
2d270 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69  -journal file) i
2d280 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74  dentified by pat
2d290 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77  hname.** zPath w
2d2a0 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ith SQLITE_OPEN_
2d2b0 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69  XXX flags matchi
2d2c0 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20  ng those passed 
2d2d0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  as the second.**
2d2e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2d2f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2d300 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65  * Such a file de
2d310 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69  scriptor may exi
2d320 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65  st if a database
2d330 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
2d340 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68  closed.** but th
2d350 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
2d360 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75  e descriptor cou
2d370 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  ld not be closed
2d380 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a   because some.**
2d390 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
2d3a0 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  riptor open on t
2d3b0 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20  he same file is 
2d3c0 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c  holding a file-l
2d3d0 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f  ock..** Refer to
2d3e0 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65   comments in the
2d3f0 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e   unixClose() fun
2d400 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65  ction and the le
2d410 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  ngthy comment.**
2d420 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73   describing "Pos
2d430 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
2d440 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72  ing" at the star
2d450 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66  t of this file f
2d460 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64  or .** further d
2d470 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69  etails. Also, ti
2d480 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a  cket #4018..**.*
2d490 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20  * If a suitable 
2d4a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2d4b0 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69  is found, then i
2d4c0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  t is returned. I
2d4d0 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c  f no.** such fil
2d4e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2d4f0 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72  located, -1 is r
2d500 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2d510 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ic UnixUnusedFd 
2d520 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28  *findReusableFd(
2d530 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2d540 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  h, int flags){. 
2d550 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2d560 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  Unused = 0;..  /
2d570 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20  * Do not search 
2d580 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
2d590 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
2d5a0 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65   vxworks. Not be
2d5b0 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72  cause.  ** vxwor
2d5c0 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e  ks would not ben
2d5d0 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68  efit from the ch
2d5e0 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20  ange (it might, 
2d5f0 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c  we're not sure),
2d600 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73  .  ** but becaus
2d610 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74  e no way to test
2d620 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2d630 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69   available. It i
2d640 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e  s better .  ** n
2d650 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b  ot to risk break
2d660 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70  ing vxworks supp
2d670 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65  ort for the sake
2d680 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63   of such an obsc
2d690 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72  ure .  ** featur
2d6a0 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56  e.  */.#if !OS_V
2d6b0 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
2d6c0 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d6e0 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74   Results of stat
2d6f0 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a  () call */..  /*
2d700 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d   A stat() call m
2d710 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69  ay fail for vari
2d720 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20  ous reasons. If 
2d730 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74  this happens, it
2d740 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20   is.  ** almost 
2d750 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20  certain that an 
2d760 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74  open() call on t
2d770 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c  he same path wil
2d780 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a  l also fail..  *
2d790 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f  * For this reaso
2d7a0 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  n, if an error o
2d7b0 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61  ccurs in the sta
2d7c0 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69  t() call here, i
2d7d0 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65  t is.  ** ignore
2d7e0 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75  d and -1 is retu
2d7f0 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
2d800 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65   will try to ope
2d810 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  n a new file.  *
2d820 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  * descriptor on 
2d830 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66  the same path, f
2d840 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  ail, and return 
2d850 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69  an error to SQLi
2d860 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76  te..  **.  ** Ev
2d870 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65  en if a subseque
2d880 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64  nt open() call d
2d890 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65  oes succeed, the
2d8a0 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66   consequences of
2d8b0 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68  .  ** not search
2d8c0 69 6e 67 20 66 6f 72 20 61 20 72 65 75 73 61 62  ing for a reusab
2d8d0 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
2d8e0 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e  or are not dire.
2d8f0 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73    */.  if( 0==os
2d900 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  Stat(zPath, &sSt
2d910 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49  at) ){.    unixI
2d920 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
2d930 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ;..    unixEnter
2d940 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e  Mutex();.    pIn
2d950 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
2d960 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  .    while( pIno
2d970 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66  de && (pInode->f
2d980 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
2d990 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
2d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2d9b0 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
2d9c0 6e 6f 21 3d 28 75 36 34 29 73 53 74 61 74 2e 73  no!=(u64)sStat.s
2d9d0 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
2d9e0 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
2d9f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
2da00 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
2da10 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
2da20 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
2da30 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
2da40 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
2da50 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
2da60 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
2da70 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
2da80 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
2da90 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
2daa0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
2dab0 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
2dac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2dad0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2dae0 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
2daf0 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
2db00 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
2db10 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
2db20 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6d 6f 64  .** Find the mod
2db30 65 2c 20 75 69 64 20 61 6e 64 20 67 69 64 20 6f  e, uid and gid o
2db40 66 20 66 69 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a  f file zFile. .*
2db50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
2db60 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
2db70 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20  t char *zFile,  
2db80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2db90 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f  ile name */.  mo
2dba0 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20  de_t *pMode,    
2dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dbc0 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e   OUT: Permission
2dbd0 73 20 6f 66 20 7a 46 69 6c 65 20 2a 2f 0a 20 20  s of zFile */.  
2dbe0 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20  uid_t *pUid,    
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc00 2f 2a 20 4f 55 54 3a 20 75 69 64 20 6f 66 20 7a  /* OUT: uid of z
2dc10 46 69 6c 65 2e 20 2a 2f 0a 20 20 67 69 64 5f 74  File. */.  gid_t
2dc20 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20   *pGid          
2dc30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2dc40 54 3a 20 67 69 64 20 6f 66 20 7a 46 69 6c 65 2e  T: gid of zFile.
2dc50 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2dc60 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2dc70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2dc80 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20  ut of stat() on 
2dc90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2dca0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2dcb0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 30 3d 3d  TE_OK;.  if( 0==
2dcc0 6f 73 53 74 61 74 28 7a 46 69 6c 65 2c 20 26 73  osStat(zFile, &s
2dcd0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 2a 70 4d  Stat) ){.    *pM
2dce0 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d  ode = sStat.st_m
2dcf0 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20  ode & 0777;.    
2dd00 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pUid = sStat.st
2dd10 5f 75 69 64 3b 0a 20 20 20 20 2a 70 47 69 64 20  _uid;.    *pGid 
2dd20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a  = sStat.st_gid;.
2dd30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2dd40 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  = SQLITE_IOERR_F
2dd50 53 54 41 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  STAT;.  }.  retu
2dd60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2dd70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2dd80 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f   called by unixO
2dd90 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69  pen() to determi
2dda0 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d  ne the unix perm
2ddb0 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72  issions.** to cr
2ddc0 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77  eate new files w
2ddd0 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  ith. If no error
2dde0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
2ddf0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2de00 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c  ned.** and a val
2de10 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ue suitable for 
2de20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74  passing as the t
2de30 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
2de40 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77   open(2) is.** w
2de50 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65  ritten to *pMode
2de60 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2de70 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
2de80 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2de90 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e   .** returned an
2dea0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
2deb0 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64  pMode is not mod
2dec0 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
2ded0 6d 6f 73 74 20 63 61 73 65 73 2c 20 74 68 69 73  most cases, this
2dee0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70   routine sets *p
2def0 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68  Mode to 0, which
2df00 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20   will become.** 
2df10 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f  an indication to
2df20 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74   robust_open() t
2df30 6f 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  o create the fil
2df40 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  e using.** SQLIT
2df50 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2df60 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73  ERMISSIONS adjus
2df70 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b  ted by the umask
2df80 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
2df90 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2dfa0 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65  d is a WAL or re
2dfb0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
2dfc0 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  le, then .** thi
2dfd0 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69  s function queri
2dfe0 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  es the file-syst
2dff0 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69  em for the permi
2e000 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a  ssions on the .*
2e010 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2e020 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
2e030 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  d sets *pMode to
2e040 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65   this value. Whe
2e050 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62  never .** possib
2e060 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72  le, WAL and jour
2e070 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72  nal files are cr
2e080 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
2e090 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  same permissions
2e0a0 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f   .** as the asso
2e0b0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
2e0c0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2e0d0 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
2e0e0 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f  _8_3_NAMES optio
2e0f0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
2e100 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  en the.** origin
2e110 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75  al filename is u
2e120 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74  navailable.  But
2e130 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e   8_3_NAMES is on
2e140 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46  ly used for.** F
2e150 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61  AT filesystems a
2e160 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64  nd permissions d
2e170 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65  o not matter the
2e180 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a  re, so just use.
2e190 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ** the default p
2e1a0 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73  ermissions..*/.s
2e1b0 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72  tatic int findCr
2e1c0 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20  eateFileMode(.  
2e1d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2e1e0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
2e1f0 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20  /* Path of file 
2e200 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67  (possibly) being
2e210 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e   created */.  in
2e220 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e240 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73   Flags passed as
2e250 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f   4th argument to
2e260 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f   xOpen() */.  mo
2e270 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20  de_t *pMode,    
2e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e290 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e   OUT: Permission
2e2a0 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77  s to open file w
2e2b0 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a  ith */.  uid_t *
2e2c0 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  pUid,           
2e2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2e2e0 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   uid to set on t
2e2f0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64  he file */.  gid
2e300 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20  _t *pGid        
2e310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e320 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20  OUT: gid to set 
2e330 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29  on the file */.)
2e340 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2e350 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2e360 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
2e370 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d  de */.  *pMode =
2e380 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b   0;.  *pUid = 0;
2e390 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20  .  *pGid = 0;.  
2e3a0 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c  if( flags & (SQL
2e3b0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
2e3c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2e3d0 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68  URNAL) ){.    ch
2e3e0 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e  ar zDb[MAX_PATHN
2e3f0 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44  AME+1];     /* D
2e400 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74  atabase file pat
2e410 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62  h */.    int nDb
2e420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e430 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e440 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20   of valid bytes 
2e450 69 6e 20 7a 44 62 20 2a 2f 0a 0a 20 20 20 20 2f  in zDb */..    /
2e460 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74  * zPath is a pat
2e470 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f  h to a WAL or jo
2e480 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
2e490 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
2e4a0 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74  derives.    ** t
2e4b0 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61  he path to the a
2e4c0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
2e4d0 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61  se file from zPa
2e4e0 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68  th. This block h
2e4f0 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68  andles.    ** th
2e500 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69  e following nami
2e510 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a  ng conventions:.
2e520 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2e530 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2e540 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  urnal".    **   
2e550 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
2e560 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
2e570 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
2e580 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  lNN".    **   "<
2e590 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e  path to db>-walN
2e5a0 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N".    **.    **
2e5b0 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64   where NN is a d
2e5c0 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54  ecimal number. T
2e5d0 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68  he NN naming sch
2e5e0 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a  emes are .    **
2e5f0 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
2e600 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f  t_multiplex.c mo
2e610 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dule..    */.   
2e620 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74   nDb = sqlite3St
2e630 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20  rlen30(zPath) - 
2e640 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  1; .    while( z
2e650 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29  Path[nDb]!='-' )
2e660 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2e670 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
2e680 53 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  S.      /* In th
2e690 65 20 6e 6f 72 6d 61 6c 20 63 61 73 65 20 28 38  e normal case (8
2e6a0 2b 33 20 66 69 6c 65 6e 61 6d 65 73 20 64 69 73  +3 filenames dis
2e6b0 61 62 6c 65 64 29 20 74 68 65 20 6a 6f 75 72 6e  abled) the journ
2e6c0 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  al filename.    
2e6d0 20 20 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65    ** is guarante
2e6e0 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20  ed to contain a 
2e6f0 27 2d 27 20 63 68 61 72 61 63 74 65 72 2e 20 2a  '-' character. *
2e700 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2e710 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  nDb>0 );.      a
2e720 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 49 73  ssert( sqlite3Is
2e730 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d  alnum(zPath[nDb]
2e740 29 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ) );.#else.     
2e750 20 2f 2a 20 49 66 20 38 2b 33 20 6e 61 6d 65 73   /* If 8+3 names
2e760 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 20 74   are possible, t
2e770 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2e780 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 63  file might not c
2e790 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ontain.      ** 
2e7a0 61 20 27 2d 27 20 63 68 61 72 61 63 74 65 72 2e  a '-' character.
2e7b0 20 20 53 6f 20 63 68 65 63 6b 20 66 6f 72 20 74    So check for t
2e7c0 68 61 74 20 63 61 73 65 20 61 6e 64 20 72 65 74  hat case and ret
2e7d0 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20  urn early. */.  
2e7e0 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c      if( nDb==0 |
2e7f0 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 3d 3d 27 2e  | zPath[nDb]=='.
2e800 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ' ) return SQLIT
2e810 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  E_OK;.#endif.   
2e820 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a     nDb--;.    }.
2e830 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20      memcpy(zDb, 
2e840 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20  zPath, nDb);.   
2e850 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27   zDb[nDb] = '\0'
2e860 3b 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 46  ;..    rc = getF
2e870 69 6c 65 4d 6f 64 65 28 7a 44 62 2c 20 70 4d 6f  ileMode(zDb, pMo
2e880 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b  de, pUid, pGid);
2e890 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
2e8a0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2e8b0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
2e8c0 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30  {.    *pMode = 0
2e8d0 36 30 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  600;.  }else if(
2e8e0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
2e8f0 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20  OPEN_URI ){.    
2e900 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
2e910 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
2e920 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
2e930 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  was opened using
2e940 20 61 20 55 52 49 0a 20 20 20 20 2a 2a 20 66 69   a URI.    ** fi
2e950 6c 65 6e 61 6d 65 2c 20 63 68 65 63 6b 20 66 6f  lename, check fo
2e960 72 20 74 68 65 20 22 6d 6f 64 65 6f 66 22 20 70  r the "modeof" p
2e970 61 72 61 6d 65 74 65 72 2e 20 49 66 20 70 72 65  arameter. If pre
2e980 73 65 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 0a  sent, interpret.
2e990 20 20 20 20 2a 2a 20 69 74 73 20 76 61 6c 75 65      ** its value
2e9a0 20 61 73 20 61 20 66 69 6c 65 6e 61 6d 65 20 61   as a filename a
2e9b0 6e 64 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74  nd try to copy t
2e9c0 68 65 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64  he mode, uid and
2e9d0 20 67 69 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a   gid from.    **
2e9e0 20 74 68 61 74 20 66 69 6c 65 2e 20 20 2a 2f 0a   that file.  */.
2e9f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2ea00 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  z = sqlite3_uri_
2ea10 70 61 72 61 6d 65 74 65 72 28 7a 50 61 74 68 2c  parameter(zPath,
2ea20 20 22 6d 6f 64 65 6f 66 22 29 3b 0a 20 20 20 20   "modeof");.    
2ea30 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 72  if( z ){.      r
2ea40 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64 65 28  c = getFileMode(
2ea50 7a 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20  z, pMode, pUid, 
2ea60 70 47 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pGid);.    }.  }
2ea70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ea80 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
2ea90 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a  file zPath..** .
2eaa0 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74  ** Previously, t
2eab0 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79  he SQLite OS lay
2eac0 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75  er used three fu
2ead0 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65  nctions in place
2eae0 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a   of this.** one:
2eaf0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
2eb00 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
2eb10 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e();.**     sqli
2eb20 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
2eb30 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  y();.**     sqli
2eb40 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
2eb50 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ve();.**.** Thes
2eb60 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f  e calls correspo
2eb70 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd to the follow
2eb80 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
2eb90 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
2eba0 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29       ReadWrite()
2ebb0 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49   ->     (READWRI
2ebc0 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20  TE | CREATE).** 
2ebd0 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20      ReadOnly()  
2ebe0 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59  ->     (READONLY
2ebf0 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78  ) .**     OpenEx
2ec00 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45  clusive() -> (RE
2ec10 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
2ec20 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a   | EXCLUSIVE).**
2ec30 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e  .** The old Open
2ec40 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65  Exclusive() acce
2ec50 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61  pted a boolean a
2ec60 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c  rgument - "delFl
2ec70 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c  ag". If.** true,
2ec80 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f   the file was co
2ec90 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61  nfigured to be a
2eca0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
2ecb0 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  eted when the.**
2ecc0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f   file handle clo
2ecd0 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20  sed. To achieve 
2ece0 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20  the same effect 
2ecf0 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a  using this new .
2ed00 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64  ** interface, ad
2ed10 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c  d the DELETEONCL
2ed20 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73  OSE flag to thos
2ed30 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76  e specified abov
2ed40 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78  e for .** OpenEx
2ed50 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74  clusive()..*/.st
2ed60 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
2ed70 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2ed80 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
2ed90 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72    /* The VFS for
2eda0 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74   which this is t
2edb0 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20  he xOpen method 
2edc0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2edd0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2ede0 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66    /* Pathname of
2edf0 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e   file to be open
2ee00 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
2ee10 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  file *pFile,    
2ee20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
2ee30 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
2ee40 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20  e filled in */. 
2ee50 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee70 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20   Input flags to 
2ee80 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e  control the open
2ee90 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ing */.  int *pO
2eea0 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
2eeb0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2eec0 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74  flags returned t
2eed0 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f  o SQLite core */
2eee0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
2eef0 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  p = (unixFile *)
2ef00 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20  pFile;.  int fd 
2ef10 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
2ef20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
2ef30 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72  descriptor retur
2ef40 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f  ned by open() */
2ef50 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
2ef60 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ef70 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
2ef80 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a  ss to open() */.
2ef90 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
2efa0 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
2efb0 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
2efc0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2efd0 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
2efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eff0 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
2f000 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
2f010 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2f020 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2f030 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2f040 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2f050 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d   int ctrlFlags =
2f060 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f070 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c  /* UNIXFILE_* fl
2f080 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73  ags */..  int is
2f090 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
2f0a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2f0b0 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
2f0c0 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
2f0d0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2f0e0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2f0f0 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
2f100 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
2f110 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2f120 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
2f130 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
2f140 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2f150 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2f160 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
2f170 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
2f180 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2f190 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ITE);.#if SQLITE
2f1a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2f1b0 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75  STYLE.  int isAu
2f1c0 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67  toProxy  = (flag
2f1d0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2f1e0 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64  AUTOPROXY);.#end
2f1f0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
2f200 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
2f210 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2f220 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
2f230 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
2f240 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2f250 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
2f260 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
2f270 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
2f280 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
2f290 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
2f2a0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
2f2b0 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
2f2c0 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
2f2d0 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
2f2e0 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
2f2f0 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
2f300 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
2f310 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
2f320 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
2f330 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65  syncDir = (isCre
2f340 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
2f350 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f360 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2f370 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
2f380 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2f390 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
2f3a0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2f3b0 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
2f3c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
2f3d0 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
2f3e0 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
2f3f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
2f400 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
2f410 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
2f420 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
2f430 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
2f440 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
2f450 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
2f460 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
2f470 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+2];.  const c
2f480 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
2f490 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
2f4a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2f4b0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
2f4c0 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
2f4d0 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
2f4e0 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
2f4f0 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
2f500 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
2f510 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
2f520 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
2f530 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
2f540 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
2f550 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
2f560 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
2f570 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
2f580 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
2f590 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
2f5a0 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
2f5b0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
2f5c0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
2f5d0 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
2f5e0 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
2f5f0 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
2f600 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
2f610 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
2f620 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
2f630 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
2f640 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
2f650 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
2f660 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
2f670 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
2f680 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
2f690 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
2f6a0 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
2f6b0 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
2f6c0 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
2f6d0 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
2f6e0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
2f6f0 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
2f700 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
2f710 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
2f720 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
2f730 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2f740 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2f750 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2f760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
2f770 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2f780 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2f790 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f7a0 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
2f7b0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2f7c0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2f7d0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2f7e0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
2f7f0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2f800 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2f810 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2f820 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
2f830 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
2f840 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
2f850 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
2f860 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
2f870 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
2f880 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f890 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
2f8a0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f8b0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
2f8c0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
2f8d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f8e0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
2f8f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2f900 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
2f910 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2f920 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
2f930 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
2f940 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2f950 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
2f960 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2f970 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
2f980 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
2f990 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2f9a0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65  .  );..  /* Dete
2f9b0 63 74 20 61 20 70 69 64 20 63 68 61 6e 67 65 20  ct a pid change 
2f9c0 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 52  and reset the PR
2f9d0 4e 47 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  NG.  There is a 
2f9e0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20  race condition. 
2f9f0 20 2a 2a 20 68 65 72 65 20 73 75 63 68 20 74 68   ** here such th
2fa00 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  at two or more t
2fa10 68 72 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e  hreads all tryin
2fa20 67 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  g to open databa
2fa30 73 65 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ses at.  ** the 
2fa40 73 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67  same instant mig
2fa50 68 74 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65  ht all reset the
2fa60 20 50 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74   PRNG.  But mult
2fa70 69 70 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a  iple resets.  **
2fa80 20 61 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20   are harmless.. 
2fa90 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d   */.  if( random
2faa0 6e 65 73 73 50 69 64 21 3d 6f 73 47 65 74 70 69  nessPid!=osGetpi
2fab0 64 28 30 29 20 29 7b 0a 20 20 20 20 72 61 6e 64  d(0) ){.    rand
2fac0 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65  omnessPid = osGe
2fad0 74 70 69 64 28 30 29 3b 0a 20 20 20 20 73 71 6c  tpid(0);.    sql
2fae0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
2faf0 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d  0,0);.  }..  mem
2fb00 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
2fb10 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20  (unixFile));..  
2fb20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
2fb30 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
2fb40 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64  {.    UnixUnused
2fb50 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20  Fd *pUnused;.   
2fb60 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
2fb70 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c  eusableFd(zName,
2fb80 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
2fb90 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
2fba0 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
2fbb0 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  fd;.    }else{. 
2fbc0 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73       pUnused = s
2fbd0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
2fbe0 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
2fbf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55  );.      if( !pU
2fc00 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
2fc10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2fc20 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2fc30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2fc40 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
2fc50 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62  d;..    /* Datab
2fc60 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
2fc70 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
2fc80 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
2fc90 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20   are not.    ** 
2fca0 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65  URIs with parame
2fcb0 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ters.  Hence, th
2fcc0 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65  ey can always be
2fcd0 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20   passed into.   
2fce0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
2fcf0 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a  parameter(). */.
2fd00 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
2fd10 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2fd20 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73  _URI) || zName[s
2fd30 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
2fd40 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69  =0 );..  }else i
2fd50 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  f( !zName ){.   
2fd60 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2fd70 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20  NULL, the upper 
2fd80 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74  layer is request
2fd90 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e  ing a temp file.
2fda0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69   */.    assert(i
2fdb0 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63  sDelete && !sync
2fdc0 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  Dir);.    rc = u
2fdd0 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  nixGetTempname(p
2fde0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
2fdf0 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
2fe00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2fe10 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2fe20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2fe30 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  zName = zTmpname
2fe40 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
2fe50 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ted temporary fi
2fe60 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61  lenames are alwa
2fe70 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  ys double-zero t
2fe80 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a  erminated.    **
2fe90 20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69   for use by sqli
2fea0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
2feb0 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  r(). */.    asse
2fec0 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e  rt( zName[strlen
2fed0 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
2fee0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72  .  }..  /* Deter
2fef0 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f  mine the value o
2ff00 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  f the flags para
2ff10 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
2ff20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20  POSIX function. 
2ff30 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73   ** open(). Thes
2ff40 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c  e must be calcul
2ff50 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65  ated even if ope
2ff60 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2ff70 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20  d, as.  ** they 
2ff80 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
2ff90 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
2ffa0 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65  e handle and use
2ffb0 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27  d by the .  ** '
2ffc0 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b  conch file' lock
2ffd0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61  ing functions la
2ffe0 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66  ter on.  */.  if
2fff0 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
30000 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
30010 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
30020 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46  eadWrite ) openF
30030 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
30040 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
30050 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
30060 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20   O_CREAT;.  if( 
30070 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70  isExclusive ) op
30080 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58  enFlags |= (O_EX
30090 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
300a0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28    openFlags |= (
300b0 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
300c0 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64  NARY);..  if( fd
300d0 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74  <0 ){.    mode_t
300e0 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
300f0 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69          /* Permi
30100 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65  ssions to create
30110 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
30120 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20    uid_t uid;    
30130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30140 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68  /* Userid for th
30150 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69  e file */.    gi
30160 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20  d_t gid;        
30170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
30180 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66  roupid for the f
30190 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ile */.    rc = 
301a0 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
301b0 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  de(zName, flags,
301c0 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64   &openMode, &uid
301d0 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28  , &gid);.    if(
301e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
301f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30200 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20  !p->pUnused );. 
30210 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
30220 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30230 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  WAL || eType==SQ
30240 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
30250 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20  OURNAL );.      
30260 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
30270 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
30280 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
30290 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
302a0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
302b0 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
302c0 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
302d0 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b  me, openFlags));
302e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
302f0 45 78 63 6c 75 73 69 76 65 20 7c 7c 20 28 6f 70  Exclusive || (op
30300 65 6e 46 6c 61 67 73 20 26 20 4f 5f 43 52 45 41  enFlags & O_CREA
30310 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  T)!=0 );.    if(
30320 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d   fd<0 && errno!=
30330 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64  EISDIR && isRead
30340 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  Write ){.      /
30350 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
30360 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
30370 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
30380 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
30390 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26  */.      flags &
303a0 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
303b0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
303c0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
303d0 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26       openFlags &
303e0 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  = ~(O_RDWR|O_CRE
303f0 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  AT);.      flags
30400 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
30410 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
30420 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
30430 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52  DONLY;.      isR
30440 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadonly = 1;.   
30450 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
30460 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
30470 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
30480 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
30490 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  d<0 ){.      rc 
304a0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
304b0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
304c0 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61  KPT, "open", zNa
304d0 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
304e0 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
304f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
30500 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
30510 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20  running as root 
30520 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67 20  and if creating 
30530 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20  a new rollback. 
30540 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72     ** journal or
30550 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20 74   WAL file, set t
30560 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  he ownership of 
30570 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57  the journal or W
30580 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  AL to be.    ** 
30590 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
305a0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
305b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
305c0 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
305d0 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
305e0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
305f0 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 72 6f  NAL) ){.      ro
30600 62 75 73 74 46 63 68 6f 77 6e 28 66 64 2c 20 75  bustFchown(fd, u
30610 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a  id, gid);.    }.
30620 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
30630 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
30640 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
30650 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
30660 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
30670 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70  pUnused ){.    p
30680 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20  ->pUnused->fd = 
30690 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73  fd;.    p->pUnus
306a0 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  ed->flags = flag
306b0 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  s;.  }..  if( is
306c0 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53  Delete ){.#if OS
306d0 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61  _VXWORKS.    zPa
306e0 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69  th = zName;.#eli
306f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
30700 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c  _UNLINK_AFTER_CL
30710 4f 53 45 29 0a 20 20 20 20 7a 50 61 74 68 20 3d  OSE).    zPath =
30720 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
30730 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ("%s", zName);. 
30740 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20     if( zPath==0 
30750 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  ){.      robust_
30760 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c  close(p, fd, __L
30770 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65  INE__);.      re
30780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
30790 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  M_BKPT;.    }.#e
307a0 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  lse.    osUnlink
307b0 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
307c0 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
307d0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
307e0 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
307f0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  p->openFlags = o
30800 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65  penFlags;.  }.#e
30810 6e 64 69 66 0a 20 20 0a 23 69 66 20 64 65 66 69  ndif.  .#if defi
30820 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
30830 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
30840 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
30850 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20  if( fstatfs(fd, 
30860 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
30870 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
30880 72 72 6e 6f 28 70 2c 20 65 72 72 6e 6f 29 3b 0a  rrno(p, errno);.
30890 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
308a0 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
308b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
308c0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
308d0 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
308e0 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73  = strncmp("msdos
308f0 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
30900 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
30910 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
30920 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
30930 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
30940 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20  IS_MSDOS;.  }.  
30950 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
30960 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66 6f  ("exfat", fsInfo
30970 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
30980 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  )) {.    ((unixF
30990 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46  ile*)pFile)->fsF
309a0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
309b0 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b  SFLAGS_IS_MSDOS;
309c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
309d0 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f 70 72  * Set up appropr
309e0 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20 2a  iate ctrlFlags *
309f0 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  /.  if( isDelete
30a00 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
30a10 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
30a20 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a  NIXFILE_DELETE;.
30a30 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
30a40 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
30a50 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
30a60 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20  XFILE_RDONLY;.  
30a70 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d  noLock = eType!=
30a80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
30a90 5f 44 42 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  _DB;.  if( noLoc
30aa0 6b 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  k )             
30ab0 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
30ac0 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
30ad0 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72  K;.  if( syncDir
30ae0 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
30af0 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
30b00 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
30b10 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
30b20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
30b30 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ) ctrlFlags |= U
30b40 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69  NIXFILE_URI;..#i
30b50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
30b60 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69  LOCKING_STYLE.#i
30b70 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
30b80 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20  PROXY_LOCKING.  
30b90 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b  isAutoProxy = 1;
30ba0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73  .#endif.  if( is
30bb0 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50  AutoProxy && (zP
30bc0 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21  ath!=NULL) && (!
30bd0 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d  noLock) && pVfs-
30be0 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68  >xOpen ){.    ch
30bf0 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67  ar *envforce = g
30c00 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f  etenv("SQLITE_FO
30c10 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
30c20 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65  G");.    int use
30c30 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Proxy = 0;..    
30c40 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  /* SQLITE_FORCE_
30c50 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31  PROXY_LOCKING==1
30c60 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77   means force alw
30c70 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30  ays use proxy, 0
30c80 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e   means .    ** n
30c90 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20  ever use proxy, 
30ca0 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70  NULL means use p
30cb0 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63  roxy for non-loc
30cc0 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20  al files only.  
30cd0 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f  */.    if( envfo
30ce0 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  rce!=NULL ){.   
30cf0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74     useProxy = at
30d00 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a  oi(envforce)>0;.
30d10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30d20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73   useProxy = !(fs
30d30 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
30d40 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  _LOCAL);.    }. 
30d50 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20     if( useProxy 
30d60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  ){.      rc = fi
30d70 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
30d80 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  s, fd, pFile, zP
30d90 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b  ath, ctrlFlags);
30da0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
30db0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30dc0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
30dd0 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
30de0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
30df0 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
30e00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30e20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
30e30 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
30e40 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
30e50 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
30e60 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
30e70 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
30e80 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
30e90 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
30ea0 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
30eb0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
30ec0 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
30ed0 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
30ee0 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
30ef0 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
30f00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30f10 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
30f20 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
30f30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
30f40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30f50 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
30f60 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
30f70 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
30f80 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
30f90 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c  pVfs, fd, pFile,
30fa0 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67   zPath, ctrlFlag
30fb0 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68  s);..open_finish
30fc0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
30fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
30fe0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70  qlite3_free(p->p
30ff0 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
31000 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
31010 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
31020 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
31030 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
31040 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
31050 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
31060 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
31070 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
31080 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
31090 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
310a0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
310b0 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
310c0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
310d0 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
310e0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
310f0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
31100 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
31110 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
31120 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
31130 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
31140 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
31150 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
31160 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
31170 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
31180 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31190 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
311a0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
311b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
311c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
311d0 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
311e0 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d  osUnlink(zPath)=
311f0 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28  =(-1) ){.    if(
31200 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23   errno==ENOENT.#
31210 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
31220 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73        || osAcces
31230 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65  s(zPath,0)!=0.#e
31240 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
31250 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
31260 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
31270 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31280 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
31290 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
312a0 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e  R_DELETE, "unlin
312b0 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  k", zPath);.    
312c0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
312d0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
312e0 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
312f0 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79  YNC.  if( (dirSy
31300 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20  nc & 1)!=0 ){.  
31310 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63    int fd;.    rc
31320 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f   = osOpenDirecto
31330 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a  ry(zPath, &fd);.
31340 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
31360 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 66 64  f( full_fsync(fd
31370 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ,0,0) ){.       
31380 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
31390 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
313a0 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e  DIR_FSYNC, "fsyn
313b0 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  c", zPath);.    
313c0 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74    }.      robust
313d0 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
313e0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c  LINE__);.    }el
313f0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
31400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
31410 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72  TOPEN );.      r
31420 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31430 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
31440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31450 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
31460 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61  xistence of or a
31470 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
31480 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
31490 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
314a0 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
314b0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
314c0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
314d0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
314e0 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
314f0 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
31500 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
31510 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
31520 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
31530 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
31540 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
31550 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
31560 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
31570 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
31580 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
31590 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
315a0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
315b0 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
315c0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
315d0 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
315e0 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
315f0 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
31600 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
31610 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
31620 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
31630 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
31640 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
31650 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
31660 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
31670 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
31680 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
31690 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
316a0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
316b0 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
316c0 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
316d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
316e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
316f0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
31700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
31710 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
31720 20 20 61 73 73 65 72 74 28 20 70 52 65 73 4f 75    assert( pResOu
31730 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  t!=0 );..  /* Th
31740 65 20 73 70 65 63 20 73 61 79 73 20 74 68 65 72  e spec says ther
31750 65 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73  e are three poss
31760 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20  ible values for 
31770 66 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79  flags.  But only
31780 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65  .  ** two of the
31790 6d 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75  m are actually u
317a0 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
317b0 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
317c0 43 43 45 53 53 5f 45 58 49 53 54 53 20 7c 7c 20  CCESS_EXISTS || 
317d0 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
317e0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 20 29  CESS_READWRITE )
317f0 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  ;..  if( flags==
31800 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
31810 49 53 54 53 20 29 7b 0a 20 20 20 20 73 74 72 75  ISTS ){.    stru
31820 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
31830 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 30 3d 3d   *pResOut = (0==
31840 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62  osStat(zPath, &b
31850 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
31860 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ze>0);.  }else{.
31870 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 6f      *pResOut = o
31880 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 57  sAccess(zPath, W
31890 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20  _OK|R_OK)==0;.  
318a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
318b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  E_OK;.}../*.**.*
318c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6b 46  /.static int mkF
318d0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 63  ullPathname(.  c
318e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
318f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
31900 2a 20 49 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  * Input path */.
31910 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20    char *zOut,   
31920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31930 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
31940 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74  er */.  int nOut
31950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31960 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
31970 61 74 65 64 20 73 69 7a 65 20 6f 66 20 62 75 66  ated size of buf
31980 66 65 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b 0a 20  fer zOut */.){. 
31990 20 69 6e 74 20 6e 50 61 74 68 20 3d 20 73 71 6c   int nPath = sql
319a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
319b0 74 68 29 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20  th);.  int iOff 
319c0 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  = 0;.  if( zPath
319d0 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]!='/' ){.    
319e0 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75  if( osGetcwd(zOu
319f0 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30 20 29 7b  t, nOut-2)==0 ){
31a00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
31a10 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
31a20 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
31a30 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68   "getcwd", zPath
31a40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66  );.    }.    iOf
31a50 66 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  f = sqlite3Strle
31a60 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7a  n30(zOut);.    z
31a70 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20 27 2f  Out[iOff++] = '/
31a80 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 4f  ';.  }.  if( (iO
31a90 66 66 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f 75 74  ff+nPath+1)>nOut
31aa0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 69 74   ){.    /* SQLit
31ab0 65 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 78  e assumes that x
31ac0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 6e  FullPathname() n
31ad0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 73 20 74 68  ul-terminates th
31ae0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 0a  e output buffer.
31af0 20 20 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 69      ** even if i
31b00 74 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  t returns an err
31b10 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f 75 74  or.  */.    zOut
31b20 5b 69 4f 66 66 5d 20 3d 20 27 5c 30 27 3b 0a 20  [iOff] = '\0';. 
31b30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31b40 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
31b50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
31b60 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 4f 66 66  printf(nOut-iOff
31b70 2c 20 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c 20 22  , &zOut[iOff], "
31b80 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 72  %s", zPath);.  r
31b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31ba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
31bb0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
31bc0 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
31bd0 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c  athname. The rel
31be0 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73  ative path.** is
31bf0 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c   stored as a nul
31c00 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
31c10 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ng in the buffer
31c20 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
31c30 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20  * zPath. .**.** 
31c40 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  zOut points to a
31c50 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
31c60 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  ast sqlite3_vfs.
31c70 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
31c80 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61   .** (in this ca
31c90 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  se, MAX_PATHNAME
31ca0 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c   bytes). The ful
31cb0 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65  l-path is writte
31cc0 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66  n to.** this buf
31cd0 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  fer before retur
31ce0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
31cf0 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68  int unixFullPath
31d00 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
31d10 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
31d20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
31d30 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
31d40 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
31d50 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
31d60 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
31d70 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
31d80 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  h */.  int nOut,
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31da0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
31db0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
31dc0 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
31dd0 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
31de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
31df0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
31e00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41  .#if !defined(HA
31e10 56 45 5f 52 45 41 44 4c 49 4e 4b 29 20 7c 7c 20  VE_READLINK) || 
31e20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 53  !defined(HAVE_LS
31e30 54 41 54 29 0a 20 20 72 65 74 75 72 6e 20 6d 6b  TAT).  return mk
31e40 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 50 61  FullPathname(zPa
31e50 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b  th, zOut, nOut);
31e60 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 20  .#else.  int rc 
31e70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
31e80 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
31e90 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20 20 20 20 20  nLink = 1;      
31ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
31eb0 62 65 72 20 6f 66 20 73 79 6d 62 6f 6c 69 63 20  ber of symbolic 
31ec0 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64 20 73  links followed s
31ed0 6f 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  o far */.  const
31ee0 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 50 61   char *zIn = zPa
31ef0 74 68 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75  th;      /* Inpu
31f00 74 20 70 61 74 68 20 66 6f 72 20 65 61 63 68 20  t path for each 
31f10 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f  iteration of loo
31f20 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65  p */.  char *zDe
31f30 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
31f40 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
31f50 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
31f60 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
31f70 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
31f80 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
31f90 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
31fa0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
31fb0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
31fc0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
31fd0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
31fe0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
31ff0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
32000 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
32010 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
32020 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
32030 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
32040 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
32050 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
32060 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
32070 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
32080 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
32090 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
320a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
320b0 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20 20 20 2f 2a  ..  do {..    /*
320c0 20 43 61 6c 6c 20 73 74 61 74 28 29 20 6f 6e 20   Call stat() on 
320d0 70 61 74 68 20 7a 49 6e 2e 20 53 65 74 20 62 4c  path zIn. Set bL
320e0 69 6e 6b 20 74 6f 20 74 72 75 65 20 69 66 20 74  ink to true if t
320f0 68 65 20 70 61 74 68 20 69 73 20 61 20 73 79 6d  he path is a sym
32100 62 6f 6c 69 63 0a 20 20 20 20 2a 2a 20 6c 69 6e  bolic.    ** lin
32110 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  k, or false othe
32120 72 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69  rwise.  */.    i
32130 6e 74 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a 20 20  nt bLink = 0;.  
32140 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
32150 66 3b 0a 20 20 20 20 69 66 28 20 6f 73 4c 73 74  f;.    if( osLst
32160 61 74 28 7a 49 6e 2c 20 26 62 75 66 29 21 3d 30  at(zIn, &buf)!=0
32170 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
32180 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20  rno!=ENOENT ){. 
32190 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
321a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
321b0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
321c0 6c 73 74 61 74 22 2c 20 7a 49 6e 29 3b 0a 20 20  lstat", zIn);.  
321d0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
321e0 0a 20 20 20 20 20 20 62 4c 69 6e 6b 20 3d 20 53  .      bLink = S
321f0 5f 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f  _ISLNK(buf.st_mo
32200 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  de);.    }..    
32210 69 66 28 20 62 4c 69 6e 6b 20 29 7b 0a 20 20 20  if( bLink ){.   
32220 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29     if( zDel==0 )
32230 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 20 3d  {.        zDel =
32240 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
32250 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 69  nOut);.        i
32260 66 28 20 7a 44 65 6c 3d 3d 30 20 29 20 72 63 20  f( zDel==0 ) rc 
32270 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
32280 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
32290 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53 51 4c   if( ++nLink>SQL
322a0 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53  ITE_MAX_SYMLINKS
322b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
322c0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
322d0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a  _BKPT;.      }..
322e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
322f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32300 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65 61     nByte = osRea
32310 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65 6c 2c  dlink(zIn, zDel,
32320 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 20 20 20 20   nOut-1);.      
32330 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b    if( nByte<0 ){
32340 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32350 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
32360 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
32370 54 2c 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a  T, "readlink", z
32380 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  In);.        }el
32390 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
323a0 28 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27 20 29  ( zDel[0]!='/' )
323b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
323c0 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t n;.           
323d0 20 66 6f 72 28 6e 20 3d 20 73 71 6c 69 74 65 33   for(n = sqlite3
323e0 53 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3b 20 6e  Strlen30(zIn); n
323f0 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d 21 3d  >0 && zIn[n-1]!=
32400 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20 20 20  '/'; n--);.     
32410 20 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65         if( nByte
32420 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20 20 20  +n+1>nOut ){.   
32430 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32440 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
32450 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
32460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32470 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
32480 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c 20 6e  zDel[n], zDel, n
32490 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 20  Byte+1);.       
324a0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44         memcpy(zD
324b0 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20 20 20  el, zIn, n);.   
324c0 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
324d0 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   += n;.         
324e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
324f0 0a 20 20 20 20 20 20 20 20 20 20 7a 44 65 6c 5b  .          zDel[
32500 6e 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20  nByte] = '\0';. 
32510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32520 0a 0a 20 20 20 20 20 20 7a 49 6e 20 3d 20 7a 44  ..      zIn = zD
32530 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  el;.    }..    a
32540 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
32550 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a 4f 75  E_OK || zIn!=zOu
32560 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27 2f 27  t || zIn[0]=='/'
32570 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
32580 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 49 6e  SQLITE_OK && zIn
32590 21 3d 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  !=zOut ){.      
325a0 72 63 20 3d 20 6d 6b 46 75 6c 6c 50 61 74 68 6e  rc = mkFullPathn
325b0 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c 20 6e  ame(zIn, zOut, n
325c0 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Out);.    }.    
325d0 69 66 28 20 62 4c 69 6e 6b 3d 3d 30 20 29 20 62  if( bLink==0 ) b
325e0 72 65 61 6b 3b 0a 20 20 20 20 7a 49 6e 20 3d 20  reak;.    zIn = 
325f0 7a 4f 75 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  zOut;.  }while( 
32600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
32610 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
32620 28 7a 44 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (zDel);.  return
32630 20 72 63 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a   rc;.#endif   /*
32640 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 20 26   HAVE_READLINK &
32650 26 20 48 41 56 45 5f 4c 53 54 41 54 20 2a 2f 0a  & HAVE_LSTAT */.
32660 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
32670 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
32680 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
32690 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
326a0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
326b0 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
326c0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
326d0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
326e0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
326f0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
32700 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
32710 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73  lude <dlfcn.h>.s
32720 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
32730 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
32740 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  fs *NotUsed, con
32750 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
32760 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me){.  UNUSED_PA
32770 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
32780 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65  ;.  return dlope
32790 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c  n(zFilename, RTL
327a0 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f  D_NOW | RTLD_GLO
327b0 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  BAL);.}../*.** S
327c0 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
327d0 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
327e0 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61  ately after a ca
327f0 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28  ll to unixDlSym(
32800 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70  ) or.** unixDlOp
32810 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75  en() fails (retu
32820 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74  rns a null point
32830 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64  er). If a more d
32840 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a  etailed error.**
32850 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69   message is avai
32860 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69  lable, it is wri
32870 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e  tten to zBufOut.
32880 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73   If no error mes
32890 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sage.** is avail
328a0 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73  able, zBufOut is
328b0 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
328c0 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73   and SQLite uses
328d0 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72   a default.** er
328e0 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
328f0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
32900 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
32910 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
32920 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
32930 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  ufOut){.  const 
32940 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
32950 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32960 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45  otUsed);.  unixE
32970 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
32980 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
32990 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
329a0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
329b0 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  ntf(nBuf, zBufOu
329c0 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  t, "%s", zErr);.
329d0 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
329e0 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
329f0 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79   void (*unixDlSy
32a00 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  m(sqlite3_vfs *N
32a10 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c  otUsed, void *p,
32a20 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
32a30 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a  ))(void){.  /* .
32a40 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70    ** GCC with -p
32a50 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73  edantic-errors s
32a60 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65  ays that C90 doe
32a70 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f  s not allow a vo
32a80 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63  id* to be.  ** c
32a90 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  ast into a point
32aa0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
32ab0 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c  .  And yet the l
32ac0 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72  ibrary dlsym() r
32ad0 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75  outine.  ** retu
32ae0 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63  rns a void* whic
32af0 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  h is really a po
32b00 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
32b10 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20  ion.  So how do 
32b20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79  we.  ** use dlsy
32b30 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74  m() with -pedant
32b40 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a  ic-errors?.  **.
32b50 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20    ** Variable x 
32b60 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64  below is defined
32b70 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72   to be a pointer
32b80 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
32b90 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d  aking.  ** param
32ba0 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20  eters void* and 
32bb0 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20  const char* and 
32bc0 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e  returning a poin
32bd0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
32be0 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69  n..  ** We initi
32bf0 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67  alize x by assig
32c00 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65  ning it a pointe
32c10 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29  r to the dlsym()
32c20 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
32c30 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74  (That assignment
32c40 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74   requires a cast
32c50 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c  .)  Then we call
32c60 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68   the function th
32c70 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73  at.  ** x points
32c80 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a   to.  .  **.  **
32c90 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   This work-aroun
32ca0 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  d is unlikely to
32cb0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
32cc0 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68  on any system wh
32cd0 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61  ere.  ** you rea
32ce0 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20  lly cannot cast 
32cf0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
32d00 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20  er into void*.  
32d10 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65  But then, on the
32d20 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64  .  ** other hand
32d30 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e  , dlsym() will n
32d40 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20  ot work on such 
32d50 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c  a system either,
32d60 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a   so we have.  **
32d70 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74   not really lost
32d80 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a   anything..  */.
32d90 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f    void (*(*x)(vo
32da0 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
32db0 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45  )(void);.  UNUSE
32dc0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32dd0 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69  sed);.  x = (voi
32de0 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e  d(*(*)(void*,con
32df0 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
32e00 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e  )dlsym;.  return
32e10 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a   (*x)(p, zSym);.
32e20 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
32e30 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
32e40 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
32e50 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
32e60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32e70 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
32e80 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
32e90 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
32ea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
32eb0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
32ec0 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
32ed0 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
32ee0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
32ef0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
32f00 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
32f10 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
32f20 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
32f30 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
32f40 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
32f50 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
32f60 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
32f70 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
32f80 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
32f90 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32fa0 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
32fb0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
32fc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32fd0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
32fe0 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
32ff0 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
33000 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
33010 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
33020 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
33030 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
33040 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
33050 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
33060 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
33070 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
33080 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
33090 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
330a0 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
330b0 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
330c0 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
330d0 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
330e0 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
330f0 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
33100 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
33110 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
33120 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
33130 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
33140 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
33150 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
33160 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
33170 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
33180 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
33190 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
331a0 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
331b0 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
331c0 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
331d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
331e0 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
331f0 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
33200 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
33210 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
33220 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
33230 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
33240 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
33250 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
33260 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
33270 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
33280 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
33290 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72  f, 0, nBuf);.  r
332a0 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f  andomnessPid = o
332b0 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69  sGetpid(0);  .#i
332c0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
332d0 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69  E_TEST) && !defi
332e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
332f0 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a  RANDOMNESS).  {.
33300 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b      int fd, got;
33310 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
33320 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
33330 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
33340 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
33350 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
33360 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
33370 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
33380 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
33390 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  f(t));.      mem
333a0 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
333b0 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73  (t)], &randomnes
333c0 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e  sPid, sizeof(ran
333d0 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20  domnessPid));.  
333e0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
333f0 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e  of(t)+sizeof(ran
33400 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69  domnessPid)<=(si
33410 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
33420 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
33430 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e  (t) + sizeof(ran
33440 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20  domnessPid);.   
33450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
33460 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66  { got = osRead(f
33470 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
33480 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
33490 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
334a0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
334b0 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
334c0 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
334d0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
334e0 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
334f0 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
33500 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
33510 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
33520 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
33530 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
33540 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
33550 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
33560 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
33570 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
33580 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
33590 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
335a0 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
335b0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
335c0 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
335d0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
335e0 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
335f0 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
33600 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
33610 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
33620 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
33630 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
33640 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
33650 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
33660 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
33670 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
33680 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
33690 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
336a0 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
336b0 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
336c0 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
336d0 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
336e0 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
336f0 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
33700 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
33710 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
33720 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
33730 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
33740 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
33750 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
33760 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
33770 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
33780 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
33790 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
337a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
337b0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
337c0 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
337d0 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
337e0 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
337f0 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
33800 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
33810 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33820 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
33830 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
33840 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
33850 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
33860 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
33870 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
33880 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
33890 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
338a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
338b0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
338c0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
338d0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
338e0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
338f0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
33900 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
33910 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
33920 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
33930 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
33940 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
33950 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
33960 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
33970 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
33980 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
33990 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
339a0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
339b0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
339c0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
339d0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
339e0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
339f0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
33a00 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
33a10 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
33a20 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
33a30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
33a40 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
33a50 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
33a60 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
33a70 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
33a80 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
33a90 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
33aa0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
33ab0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
33ac0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
33ad0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
33ae0 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
33af0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
33b00 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
33b10 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
33b20 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
33b30 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
33b40 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
33b50 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33b60 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
33b70 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
33b80 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
33b90 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
33ba0 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
33bb0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
33bc0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
33bd0 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66  LITE_OK;.#if def
33be0 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
33bf0 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
33c00 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
33c10 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
33c20 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
33c30 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
33c40 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
33c50 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
33c60 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
33c70 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
33c80 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
33c90 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
33ca0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
33cb0 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
33cc0 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
33cd0 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
33ce0 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
33cf0 4e 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67 65 74  Now;.  (void)get
33d00 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c  timeofday(&sNow,
33d10 20 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20   0);  /* Cannot 
33d20 66 61 69 6c 20 67 69 76 65 6e 20 76 61 6c 69 64  fail given valid
33d30 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
33d40 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
33d50 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
33d60 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
33d70 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  _sec + sNow.tv_u
33d80 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66  sec/1000;.#endif
33d90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
33da0 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
33db0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
33dc0 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
33dd0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
33de0 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
33df0 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
33e00 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
33e10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33e20 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33e30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
33e40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33e50 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
33e60 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
33e70 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
33e80 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
33e90 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
33ea0 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
33eb0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
33ec0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
33ed0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
33ee0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
33ef0 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
33f00 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
33f10 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
33f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33f30 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
33f40 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
33f50 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
33f60 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
33f70 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69  int64 i = 0;.  i
33f80 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f  nt rc;.  UNUSED_
33f90 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
33fa0 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43  d);.  rc = unixC
33fb0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
33fc0 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77  0, &i);.  *prNow
33fd0 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
33fe0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33ff0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
34000 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 20 30  nixCurrentTime 0
34010 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
34020 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  he xGetLastError
34030 28 29 20 6d 65 74 68 6f 64 20 69 73 20 64 65 73  () method is des
34040 69 67 6e 65 64 20 74 6f 20 72 65 74 75 72 6e 20  igned to return 
34050 61 20 62 65 74 74 65 72 0a 2a 2a 20 6c 6f 77 2d  a better.** low-
34060 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73  level error mess
34070 61 67 65 20 77 68 65 6e 20 6f 70 65 72 61 74 69  age when operati
34080 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
34090 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
340a0 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
340b0 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74 68 65  ation.  Only the
340c0 20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20   integer return 
340d0 63 6f 64 65 20 69 73 20 63 75 72 72 65 6e 74 6c  code is currentl
340e0 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 73 74  y.** used..*/.st
340f0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
34100 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
34110 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
34120 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68  int NotUsed2, ch
34130 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20  ar *NotUsed3){. 
34140 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
34150 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e  R(NotUsed);.  UN
34160 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
34170 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53  otUsed2);.  UNUS
34180 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
34190 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e  Used3);.  return
341a0 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   errno;.}.../*.*
341b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
341c0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73  ******* End of s
341d0 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
341e0 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
341f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
34200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
34250 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
34260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
342a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
342b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
342c0 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a   Proxy Locking *
342d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
342e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
342f0 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  **.** Proxy lock
34300 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c  ing is a "uber-l
34310 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69  ocking-method" i
34320 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49  n this sense:  I
34330 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74  t uses the.** ot
34340 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  her locking meth
34350 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79  ods on secondary
34360 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72   lock files.  Pr
34370 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
34380 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f  .** meta-layer o
34390 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70  ver top of the p
343a0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
343b0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f   implemented abo
343c0 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73  ve.  For.** this
343d0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
343e0 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
343f0 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c  ments of proxy l
34400 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ocking is deferr
34410 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65  ed.** until late
34420 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65   in the file (he
34430 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  re) after all of
34440 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d   the other I/O m
34450 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62  ethods have.** b
34460 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f  een defined - so
34470 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74   that the primit
34480 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ive locking meth
34490 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ods are availabl
344a0 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73  e.** as services
344b0 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68   to help with th
344c0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
344d0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
344e0 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  g..**.****.**.**
344f0 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   The default loc
34500 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20  king schemes in 
34510 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d  SQLite use byte-
34520 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  range locks on t
34530 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
34540 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  ile to coordinat
34550 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65  e safe, concurre
34560 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  nt access by mul
34570 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a  tiple readers.**
34580 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74   and writers [ht
34590 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
345a0 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e  lockingv3.html].
345b0 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20    The five file 
345c0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65  locking.** state
345d0 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e  s (UNLOCKED, PEN
345e0 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45  DING, SHARED, RE
345f0 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56  SERVED, EXCLUSIV
34600 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  E) are implement
34610 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72  ed.** as POSIX r
34620 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b  ead & write lock
34630 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74  s over fixed set
34640 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76   of locations (v
34650 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e  ia fsctl),.** on
34660 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c   AFP and SMB onl
34670 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  y exclusive byte
34680 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
34690 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66   available via f
346a0 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f  sctl.** with _IO
346b0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
346c0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
346d0 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68  PB2) to track th
346e0 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e  e same 5 states.
346f0 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20  .** To simulate 
34700 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65  a F_RDLCK on the
34710 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f   shared range, o
34720 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79  n AFP a randomly
34730 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64   selected.** add
34740 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72  ress in the shar
34750 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
34760 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c  n for a SHARED l
34770 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a  ock, the entire.
34780 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  ** shared range 
34790 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20  is taken for an 
347a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a  EXCLUSIVE lock):
347b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44  .**.**      PEND
347c0 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
347d0 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20  0x40000000.**   
347e0 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
347f0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
34800 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
34810 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
34820 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
34830 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
34840 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
34850 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
34860 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
34870 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
34880 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
34890 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
348a0 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
348b0 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
348c0 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
348d0 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
348e0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
348f0 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
34900 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
34910 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
34920 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
34930 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
34940 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
34950 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
34960 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
34970 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
34980 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
34990 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
349a0 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
349b0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
349c0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
349d0 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
349e0 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
349f0 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
34a00 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
34a10 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
34a20 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
34a30 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
34a40 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
34a50 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
34a60 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
34a70 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
34a80 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
34a90 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
34aa0 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
34ab0 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
34ac0 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
34ad0 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
34ae0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
34af0 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
34b00 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
34b10 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
34b20 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
34b30 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
34b40 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
34b50 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
34b60 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
34b70 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
34b80 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
34b90 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
34ba0 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
34bb0 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
34bc0 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
34bd0 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
34be0 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
34bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
34c00 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
34c10 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
34c20 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
34c30 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ame, SQLITE_FCNT
34c40 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
34c50 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ILE,.**         
34c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70                <p
34c70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61  roxy_path> | ":a
34c80 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69  uto:");.**  sqli
34c90 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
34ca0 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
34cb0 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f  ITE_FCNTL_GET_LO
34cc0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
34cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ce0 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61        &<proxy_pa
34cf0 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53  th>);.**.**.** S
34d00 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a  QL pragmas.**.**
34d10 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
34d20 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
34d30 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e  ile=<proxy_path>
34d40 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52   | :auto:.**  PR
34d50 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
34d60 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a  lock_proxy_file.
34d70 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67  **.** Specifying
34d80 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20   ":auto:" means 
34d90 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73  that if there is
34da0 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69   a conch file wi
34db0 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a  th a matching.**
34dc0 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20   host ID in it, 
34dd0 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69  the proxy path i
34de0 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
34df0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f   will be used, o
34e00 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72  therwise.** a pr
34e10 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f  oxy path based o
34e20 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d  n the user's tem
34e30 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f  p dir.** (via co
34e40 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
34e50 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e  _USER_TEMP_DIR,.
34e60 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65  ..)) will be use
34e70 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74  d and the.** act
34e80 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e  ual proxy file n
34e90 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ame is generated
34ea0 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61   from the name a
34eb0 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a  nd path of the.*
34ec0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
34ed0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
34ee0 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64  *.**       For d
34ef0 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55  atabase path "/U
34f00 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20  sers/me/foo.db" 
34f10 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f  .**       The lo
34f20 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20  ck path will be 
34f30 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65  "<tmpdir>/sqlite
34f40 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65  plocks/_Users_me
34f50 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a  _foo.db:auto:").
34f60 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63  **.** Once a loc
34f70 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69  k proxy is confi
34f80 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61  gured for a data
34f90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c  base connection,
34fa0 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62   it can not.** b
34fb0 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76  e removed, howev
34fc0 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69  er it may be swi
34fd0 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65  tched to a diffe
34fe0 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20  rent proxy path 
34ff0 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65  via.** the above
35000 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20   APIs (assuming 
35010 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  the conch file i
35020 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64  s not being held
35030 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63   by another.** c
35040 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f  onnection or pro
35050 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  cess). .**.**.**
35060 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69   How proxy locki
35070 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d  ng works.** ----
35080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35090 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ---.**.** Proxy 
350a0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c  file locking rel
350b0 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e  ies primarily on
350c0 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74   two new support
350d0 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a  ing files: .**.*
350e0 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c  *   *  conch fil
350f0 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73  e to limit acces
35100 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
35110 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67  e file to a sing
35120 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20  le host.**      
35130 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20  at a time.**.** 
35140 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20    *  proxy file 
35150 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78  to act as a prox
35160 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f  y for the adviso
35170 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c  ry locks normall
35180 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20  y.**      taken 
35190 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
351a0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20  **.** The conch 
351b0 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20  file - to use a 
351c0 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69  proxy file, sqli
351d0 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68  te must first "h
351e0 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a  old the conch".*
351f0 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73  * by taking an s
35200 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72  qlite-style shar
35210 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
35220 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69  onch file, readi
35230 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
35240 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67  ts and comparing
35250 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71   the host's uniq
35260 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20  ue host ID (see 
35270 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a  below) and lock.
35280 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67  ** proxy path ag
35290 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73  ainst the values
352a0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
352b0 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68  onch.  The conch
352c0 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72   file is.** stor
352d0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
352e0 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20  irectory as the 
352f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
35300 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a  d the file name.
35310 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20  ** is patterned 
35320 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61  after the databa
35330 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  se file name as 
35340 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e  ".<databasename>
35350 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74  -conch"..** If t
35360 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f  he conch file do
35370 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  es not exist, or
35380 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f   its contents do
35390 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a   not match the.*
353a0 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72  * host ID and/or
353b0 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65   proxy path, the
353c0 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73  n the lock is es
353d0 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78  calated to an ex
353e0 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20  clusive.** lock 
353f0 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69  and the conch fi
35400 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75  le contents is u
35410 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
35420 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78  host ID and prox
35430 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68  y.** path and th
35440 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72  e lock is downgr
35450 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64  aded to a shared
35460 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66   lock again.  If
35470 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73   the conch.** is
35480 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
35490 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61   process (with a
354a0 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74   shared lock), t
354b0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
354c0 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61  k.** will fail a
354d0 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  nd SQLITE_BUSY i
354e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
354f0 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
35500 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65   - a single-byte
35510 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61   file used for a
35520 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65  ll advisory file
35530 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c   locks.** normal
35540 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20  ly taken on the 
35550 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
35560 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72   This allows for
35570 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a   safe sharing.**
35580 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
35590 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70   file for multip
355a0 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  le readers and w
355b0 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61  riters on the sa
355c0 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20  me.** host (the 
355d0 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68  conch ensures th
355e0 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20  at they all use 
355f0 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c  the same local l
35600 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a  ock file)..**.**
35610 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20   Requesting the 
35620 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20  lock proxy does 
35630 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  not immediately 
35640 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20  take the conch, 
35650 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61  it is.** only ta
35660 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72  ken when the fir
35670 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f  st request to lo
35680 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ck database file
35690 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54   is made.  .** T
356a0 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
356b0 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65  semantics of the
356c0 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63   traditional loc
356d0 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77  king behavior, w
356e0 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  here.** opening 
356f0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
35700 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
35710 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20  does not take a 
35720 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54  lock on it..** T
35730 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61  he shared lock a
35740 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  nd an open file 
35750 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d  descriptor are m
35760 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20  aintained until 
35770 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  .** the connecti
35780 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
35790 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a  se is closed. .*
357a0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
357b0 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ile and the lock
357c0 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20   file are never 
357d0 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20  deleted so they 
357e0 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  only need.** to 
357f0 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66  be created the f
35800 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61  irst time they a
35810 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  re used..**.** C
35820 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
35830 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ions.** --------
35840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
35850 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46  .**  SQLITE_PREF
35860 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
35870 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74  .**.**       Dat
35880 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65  abase files acce
35890 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61  ssed on non-loca
358a0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61  l file systems a
358b0 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f  re.**       auto
358c0 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67  matically config
358d0 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c  ured for proxy l
358e0 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c  ocking, lock fil
358f0 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  es are.**       
35900 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
35910 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61  lly using the sa
35920 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20  me logic as.**  
35930 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
35940 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75  _proxy_file=":au
35950 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  to:".**    .**  
35960 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
35970 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45  UG.**.**       E
35980 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69  nables the loggi
35990 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73  ng of error mess
359a0 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74  ages during host
359b0 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20   id file.**     
359c0 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20    retrieval and 
359d0 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  creation.**.**  
359e0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a  LOCKPROXYDIR.**.
359f0 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64  **       Overrid
35a00 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  es the default d
35a10 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f  irectory used fo
35a20 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  r lock proxy fil
35a30 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
35a40 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d   are named autom
35a50 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65  atically via the
35a60 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e   ":auto:" settin
35a70 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  g.**.**  SQLITE_
35a80 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
35a90 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a  _PERMISSIONS.**.
35aa0 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73  **       Permiss
35ab0 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e  ions to use when
35ac0 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65   creating a dire
35ad0 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e  ctory for storin
35ae0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c  g the.**       l
35af0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c  ock proxy files,
35b00 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
35b10 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20  LOCKPROXYDIR is 
35b20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a  not set..**    .
35b30 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e  **    .** As men
35b40 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68  tioned above, wh
35b50 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  en compiled with
35b60 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
35b70 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a  ROXY_LOCKING,.**
35b80 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76   setting the env
35b90 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
35ba0 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  e SQLITE_FORCE_P
35bb0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20  ROXY_LOCKING to 
35bc0 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20  1 will.** force 
35bd0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
35be0 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65   be used for eve
35bf0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
35c00 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a   opened, and 0.*
35c10 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74  * will force aut
35c20 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63  omatic proxy loc
35c30 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62  king to be disab
35c40 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  led for all data
35c50 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65  base.** files (e
35c60 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e  xplicitly callin
35c70 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  g the SQLITE_FCN
35c80 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
35c90 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a  FILE pragma or.*
35ca0 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f  * sqlite_file_co
35cb0 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74  ntrol API is not
35cc0 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c   affected by SQL
35cd0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
35ce0 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a  LOCKING)..*/../*
35cf0 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
35d00 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
35d10 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a  ble on MacOSX .*
35d20 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
35d30 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
35d40 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
35d50 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54  G_STYLE../*.** T
35d60 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  he proxyLockingC
35d70 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70  ontext has the p
35d80 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72  ath and file str
35d90 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20  uctures for the 
35da0 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c  remote .** and l
35db0 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73  ocal proxy files
35dc0 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65   in it.*/.typede
35dd0 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  f struct proxyLo
35de0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f  ckingContext pro
35df0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
35e00 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  ;.struct proxyLo
35e10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
35e20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
35e30 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  File;         /*
35e40 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   Open conch file
35e50 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
35e60 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20  hFilePath;      
35e70 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
35e80 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
35e90 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
35ea0 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f  Proxy;         /
35eb0 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63  * Open proxy loc
35ec0 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
35ed0 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b   *lockProxyPath;
35ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
35ef0 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
35f00 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
35f10 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
35f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
35f30 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
35f40 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63  le */.  int conc
35f50 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  hHeld;          
35f60 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65       /* 1 if the
35f70 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20   conch is held, 
35f80 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a  -1 if lockless *
35f90 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20  /.  int nFails; 
35fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
35fc0 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75  nch taking failu
35fd0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  res */.  void *o
35fe0 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
35ff0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
36000 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
36010 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
36020 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
36030 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
36040 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
36050 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
36060 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
36070 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
36080 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
36090 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72  ck file path for
360a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
360b0 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74   dbPath is writt
360c0 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a  en into lPath, .
360d0 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f  ** which must po
360e0 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72  int to valid, wr
360f0 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61  itable memory la
36100 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
36110 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a   maxLen length.*
36120 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f  * file path. .*/
36130 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
36140 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
36150 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
36160 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
36170 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
36180 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
36190 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
361a0 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
361b0 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
361c0 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
361d0 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
361e0 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
361f0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
36200 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
36210 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43   if( !confstr(_C
36220 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
36230 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
36240 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  axLen) ){.      
36250 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
36260 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73  KPATH  failed %s
36270 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64   errno=%d pid=%d
36280 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
36290 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f      lPath, errno
362a0 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
362b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
362c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
362d0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
362e0 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
362f0 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20  "sqliteplocks", 
36300 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d  maxLen);    .  }
36310 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20  .# else.  len = 
36320 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22  strlcpy(lPath, "
36330 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  /tmp/", maxLen);
36340 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
36350 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e  .  if( lPath[len
36360 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  -1]!='/' ){.    
36370 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
36380 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e  ath, "/", maxLen
36390 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74  );.  }.  .  /* t
363a0 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20  ransform the db 
363b0 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65  path to a unique
363c0 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20   cache name */. 
363d0 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74   dbLen = (int)st
363e0 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20  rlen(dbPath);.  
363f0 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65  for( i=0; i<dbLe
36400 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28  n && (i+len+7)<(
36410 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29  int)maxLen; i++)
36420 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64  {.    char c = d
36430 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50  bPath[i];.    lP
36440 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d  ath[i+len] = (c=
36450 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d  ='/')?'_':c;.  }
36460 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d  .  lPath[i+len]=
36470 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28  '\0';.  strlcat(
36480 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c  lPath, ":auto:",
36490 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52   maxLen);.  OSTR
364a0 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
364b0 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
364c0 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
364d0 20 6c 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64   lPath, osGetpid
364e0 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (0)));.  return 
364f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
36500 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68   . ** Creates th
36510 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20  e lock file and 
36520 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65  any missing dire
36530 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50  ctories in lockP
36540 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ath. */.static i
36550 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  nt proxyCreateLo
36560 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
36570 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20  r *lockPath){.  
36580 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68  int i, len;.  ch
36590 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45  ar buf[MAXPATHLE
365a0 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20  N];.  int start 
365b0 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
365c0 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29  (lockPath!=NULL)
365d0 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
365e0 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74  eate all the int
365f0 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74  ermediate direct
36600 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d  ories */.  len =
36610 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63   (int)strlen(loc
36620 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d  kPath);.  buf[0]
36630 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a   = lockPath[0];.
36640 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65    for( i=1; i<le
36650 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66  n; i++ ){.    if
36660 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d  ( lockPath[i] ==
36670 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61   '/' && (i - sta
36680 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20  rt > 0) ){.     
36690 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69   /* only mkdir i
366a0 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e  f leaf dir != ".
366b0 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22  " or "/" or ".."
366c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d   */.      if( i-
366d0 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74  start>2 || (i-st
366e0 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74  art==1 && buf[st
366f0 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
36700 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27  uf[start] != '/'
36710 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ) .         || (
36720 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75  i-start==2 && bu
36730 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
36740 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20  && buf[start+1] 
36750 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  != '.') ){.     
36760 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a     buf[i]='\0';.
36770 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b          if( osMk
36780 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
36790 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
367a0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
367b0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
367c0 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
367d0 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
367e0 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
367f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
36800 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
36810 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
36820 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
36830 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
36840 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
36850 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
36860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36870 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
36880 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
36890 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
368a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
368b0 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20  n err;.         
368c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
368d0 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
368e0 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =i+1;.    }.    
368f0 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[i] = lockPat
36900 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  h[i];.  }.  OSTR
36910 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
36920 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
36930 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
36940 6e 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73 47 65  n",lockPath,osGe
36950 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74  tpid(0)));.  ret
36960 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
36970 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
36980 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
36990 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
369a0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
369b0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
369c0 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
369d0 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
369e0 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
369f0 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
36a00 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
36a10 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
36a20 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
36a30 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
36a40 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
36a50 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
36a60 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
36a70 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
36a80 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
36a90 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
36aa0 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
36ab0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
36ac0 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
36ad0 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
36ae0 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
36af0 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
36b00 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
36b10 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
36b20 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
36b30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
36b40 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
36b50 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
36b60 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
36b70 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
36b80 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
36b90 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  1;.  unixFile *p
36ba0 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
36bb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
36bc0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
36bd0 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
36be0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d   sqlite3_vfs dum
36bf0 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72  myVfs;.  int ter
36c00 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  rno = 0;.  UnixU
36c10 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
36c20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31   = NULL;..  /* 1
36c30 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f  . first try to o
36c40 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
36c50 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74  ile.  ** 2. if t
36c60 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74  hat fails, and t
36c70 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69  his is a lock fi
36c80 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20  le (not-conch), 
36c90 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  try creating.  *
36ca0 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  * the parent dir
36cb0 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65  ectories and the
36cc0 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a  n try again..  *
36cd0 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 3. if that fai
36ce0 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ls, try to open 
36cf0 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e  the file read-on
36d00 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73  ly.  ** otherwis
36d10 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69  e return BUSY (i
36d20 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20  f lock file) or 
36d30 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65  CANTOPEN for the
36d40 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f   conch file.  */
36d50 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e  .  pUnused = fin
36d60 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68  dReusableFd(path
36d70 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20  , openFlags);.  
36d80 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
36d90 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
36da0 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >fd;.  }else{.  
36db0 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
36dc0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a  te3_malloc64(siz
36dd0 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
36de0 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
36df0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
36e00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
36e10 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
36e20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
36e30 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
36e40 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
36e50 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  , 0);.    terrno
36e60 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
36e70 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( fd<0 && errno=
36e80 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63  =ENOENT && isloc
36e90 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  kfile ){.      i
36ea0 66 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  f( proxyCreateLo
36eb0 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20  ckPath(path) == 
36ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36ed0 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
36ee0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
36ef0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  Flags, 0);.     
36f00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
36f10 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f  f( fd<0 ){.    o
36f20 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
36f30 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  NLY;.    fd = ro
36f40 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
36f50 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
36f60 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
36f70 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c  o;.  }.  if( fd<
36f80 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c  0 ){.    if( isl
36f90 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
36fa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
36fb0 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
36fc0 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
36fd0 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
36fe0 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
36ff0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
37000 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
37010 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37020 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
37030 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
37040 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
37050 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
37060 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
37070 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
37080 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
37090 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
370a0 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
370b0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65  e3_malloc64(size
370c0 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
370d0 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
370e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
370f0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
37100 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f  goto end_create_
37110 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d  proxy;.  }.  mem
37120 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
37130 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
37140 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67    pNew->openFlag
37150 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
37160 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66   memset(&dummyVf
37170 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  s, 0, sizeof(dum
37180 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79  myVfs));.  dummy
37190 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28  Vfs.pAppData = (
371a0 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
371b0 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79  oFinder;.  dummy
371c0 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d  Vfs.zName = "dum
371d0 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e  my";.  pUnused->
371e0 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73  fd = fd;.  pUnus
371f0 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e  ed->flags = open
37200 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70  Flags;.  pNew->p
37210 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
37220 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  ;.  .  rc = fill
37230 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d  InUnixFile(&dumm
37240 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c 69 74  yVfs, fd, (sqlit
37250 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70  e3_file*)pNew, p
37260 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ath, 0);.  if( r
37270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37280 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e      *ppFile = pN
37290 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ew;.    return S
372a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e  QLITE_OK;.  }.en
372b0 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20  d_create_proxy: 
372c0 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f     .  robust_clo
372d0 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c  se(pNew, fd, __L
372e0 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65  INE__);.  sqlite
372f0 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
37300 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e  sqlite3_free(pUn
37310 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  used);.  return 
37320 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
37330 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d  LITE_TEST./* sim
37340 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
37350 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
37360 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
37370 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74  ile paths */.int
37380 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
37390 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  num = 0;.#endif.
373a0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
373b0 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20  OSTIDLEN    16  
373c0 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f  /* conch file ho
373d0 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a  st id length */.
373e0 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 45 54  .#ifdef HAVE_GET
373f0 48 4f 53 54 55 55 49 44 0a 2f 2a 20 4e 6f 74 20  HOSTUUID./* Not 
37400 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69  always defined i
37410 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73  n the headers as
37420 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
37430 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65  */.extern int ge
37440 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74  thostuuid(uuid_t
37450 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63   id, const struc
37460 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74  t timespec *wait
37470 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 67 65  );.#endif../* ge
37480 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76 69  t the host ID vi
37490 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c  a gethostuuid(),
374a0 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f   pHostID must po
374b0 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53  int to PROXY_HOS
374c0 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73  TIDLEN .** bytes
374d0 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d   of writable mem
374e0 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
374f0 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49  nt proxyGetHostI
37500 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  D(unsigned char 
37510 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70  *pHostID, int *p
37520 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  Error){.  assert
37530 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  (PROXY_HOSTIDLEN
37540 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f   == sizeof(uuid_
37550 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48  t));.  memset(pH
37560 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f  ostID, 0, PROXY_
37570 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 64  HOSTIDLEN);.#ifd
37580 65 66 20 48 41 56 45 5f 47 45 54 48 4f 53 54 55  ef HAVE_GETHOSTU
37590 55 49 44 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  UID.  {.    stru
375a0 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65  ct timespec time
375b0 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a  out = {1, 0}; /*
375c0 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a   1 sec timeout *
375d0 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73  /.    if( gethos
375e0 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
375f0 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
37600 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
37610 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72  o;.      if( pEr
37620 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ror ){.        *
37630 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20  pError = err;.  
37640 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
37650 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
37660 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
37670 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
37680 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e  TER(pError);.#en
37690 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
376a0 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
376b0 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
376c0 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
376d0 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
376e0 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
376f0 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
37700 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
37710 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
37720 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
37730 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
37740 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
37750 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
37760 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
37770 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
37780 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
37790 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
377a0 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
377b0 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
377c0 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
377d0 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
377e0 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
377f0 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
37800 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
37810 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
37820 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
37830 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
37840 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
37850 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
37860 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
37870 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
37880 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
37890 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
378a0 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
378b0 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
378c0 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
378d0 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
378e0 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
378f0 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
37900 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
37910 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
37920 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
37930 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
37940 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
37950 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
37960 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
37970 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
37980 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
37990 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
379a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
379b0 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
379c0 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
379d0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
379e0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
379f0 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
37a00 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
37a10 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
37a20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
37a30 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
37a40 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
37a50 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
37a60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
37a70 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
37a80 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
37a90 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
37aa0 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
37ab0 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
37ac0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
37ad0 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
37ae0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
37af0 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
37b00 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
37b10 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
37b20 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
37b30 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
37b40 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
37b50 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
37b60 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
37b70 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
37b80 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
37b90 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
37ba0 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
37bb0 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
37bc0 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
37bd0 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
37be0 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
37bf0 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
37c00 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
37c10 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
37c20 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
37c30 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
37c40 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
37c50 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
37c60 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
37c70 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
37c80 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
37c90 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
37ca0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
37cb0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
37cc0 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
37cd0 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
37ce0 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
37cf0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
37d00 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
37d10 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
37d20 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
37d30 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
37d40 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
37d50 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
37d60 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
37d70 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
37d80 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
37d90 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
37da0 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
37db0 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
37dc0 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
37dd0 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
37de0 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
37df0 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
37e00 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69  O_EXCL), 0);.  i
37e10 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73  f( fd<0 ){.    s
37e20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
37e30 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
37e40 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20  errmsg, "create 
37e50 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
37e60 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
37e70 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
37e80 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65  }.  if( osPwrite
37e90 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65  (fd, buf, readLe
37ea0 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f  n, 0) != (ssize_
37eb0 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20  t)readLen ){.   
37ec0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
37ed0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
37ee0 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65  , errmsg, "write
37ef0 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
37f00 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
37f10 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
37f20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28   }.  if( rename(
37f30 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b  tPath, cPath) ){
37f40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
37f50 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
37f60 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72  msg), errmsg, "r
37f70 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64  ename failed (%d
37f80 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
37f90 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
37fa0 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ck;.  }.  rc = 0
37fb0 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
37fc0 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65  rr, "broke stale
37fd0 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20   lock on %s\n", 
37fe0 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74  cPath);.  robust
37ff0 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f  _close(pFile, co
38000 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  nchFile->h, __LI
38010 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69  NE__);.  conchFi
38020 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f  le->h = fd;.  co
38030 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  nchFile->openFla
38040 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
38050 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61  CREAT;..end_brea
38060 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20  klock:.  if( rc 
38070 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  ){.    if( fd>=0
38080 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
38090 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20  nk(tPath);.     
380a0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
380b0 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  ile, fd, __LINE_
380c0 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  _);.    }.    fp
380d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
380e0 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73  ailed to break s
380f0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c  tale lock on %s,
38100 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65   %s\n", cPath, e
38110 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
38120 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
38130 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65  ake the requeste
38140 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
38150 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65  nch file and bre
38160 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20  ak a stale lock 
38170 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20  if the .** host 
38180 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  id matches..*/.s
38190 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
381a0 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
381b0 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
381c0 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c   myHostID, int l
381d0 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78  ockType){.  prox
381e0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
381f0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
38200 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
38210 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
38220 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c  text; .  unixFil
38230 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
38240 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
38250 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
38260 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69  E_OK;.  int nTri
38270 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  es = 0;.  struct
38280 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d   timespec conchM
38290 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d  odTime;.  .  mem
382a0 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d  set(&conchModTim
382b0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e  e, 0, sizeof(con
382c0 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64  chModTime));.  d
382d0 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e  o {.    rc = con
382e0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
382f0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
38300 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
38310 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
38320 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69  nTries ++;.    i
38330 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
38340 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  SY ){.      /* I
38350 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65  f the lock faile
38360 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20  d (busy):.      
38370 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20   * 1st try: get 
38380 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20  the mod time of 
38390 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20  the conch, wait 
383a0 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61  0.5s and try aga
383b0 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e  in. .       * 2n
383c0 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74  d try: fail if t
383d0 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e  he mod time chan
383e0 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69  ged or host id i
383f0 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69  s different, wai
38400 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20  t .       *     
38410 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64        10 sec and
38420 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20   try again.     
38430 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65    * 3rd try: bre
38440 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65  ak the lock unle
38450 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  ss the mod time 
38460 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20  has changed..   
38470 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72      */.      str
38480 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
38490 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
384a0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62  conchFile->h, &b
384b0 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  uf) ){.        s
384c0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
384d0 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
384e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
384f0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
38500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
38510 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
38520 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1 ){.        con
38530 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e  chModTime = buf.
38540 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20  st_mtimespec;.  
38550 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30        usleep(500
38560 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e  000); /* wait 0.
38570 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  5 sec and try th
38580 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20  e lock again*/. 
38590 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
385a0 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
385b0 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
385c0 3e 31 20 29 3b 0a 20