/ Hex Artifact Content
Login

Artifact a45a0d2fc8e0e78d018c4b25a705217212e990fa:


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 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61  if../*.** standa
0c30: 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73  rd include files
0c40: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  ..*/.#include <s
0c50: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ys/types.h>.#inc
0c60: 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68  lude <sys/stat.h
0c70: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74  >.#include <fcnt
0c80: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  l.h>.#include <u
0c90: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
0ca0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c  e <time.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  .#include <errno
0cd0: 2e 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .h>.#if !defined
0ce0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
0cf0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
0d00: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 69 6e 63  MMAP_SIZE>0.#inc
0d10: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0d20: 3e 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53  >.#endif...#if S
0d30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0d40: 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63  KING_STYLE.# inc
0d50: 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e  lude <sys/ioctl.
0d60: 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f 52  h>.# if OS_VXWOR
0d70: 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  KS.#  include <s
0d80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20 69  emaphore.h>.#  i
0d90: 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68  nclude <limits.h
0da0: 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63 6c  >.# else.#  incl
0db0: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e  ude <sys/file.h>
0dc0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  .#  include <sys
0dd0: 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64 69  /param.h>.# endi
0de0: 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  f.#endif /* SQLI
0df0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0e00: 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
0e10: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
0e20: 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45 4e  _) || (SQLITE_EN
0e30: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
0e40: 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
0e50: 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  S).# include <sy
0e60: 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69  s/mount.h>.#endi
0e70: 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55  f..#ifdef HAVE_U
0e80: 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c  TIME.# include <
0e90: 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a  utime.h>.#endif.
0ea0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
0eb0: 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69 6c  alues of unixFil
0ec0: 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65  e.fsFlags.*/.#de
0ed0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46 4c  fine SQLITE_FSFL
0ee0: 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20  AGS_IS_MSDOS    
0ef0: 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   0x1../*.** If w
0f00: 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72 65  e are to be thre
0f10: 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64 65  ad-safe, include
0f20: 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68 65   the pthreads he
0f30: 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65 0a  ader and define.
0f40: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55 4e  ** the SQLITE_UN
0f50: 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72 6f  IX_THREADS macro
0f60: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
0f70: 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63  THREADSAFE.# inc
0f80: 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e  lude <pthread.h>
0f90: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
0fa0: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a  _UNIX_THREADS 1.
0fb0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0fc0: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
0fd0: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
0fe0: 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69  a new file.*/.#i
0ff0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  fndef SQLITE_DEF
1000: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
1010: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
1020: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
1030: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  LE_PERMISSIONS 0
1040: 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  644.#endif../*.*
1050: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
1060: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
1070: 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20 64  ing auto proxy d
1080: 69 72 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ir.*/.#ifndef SQ
1090: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
10a0: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
10b0: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
10c0: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
10d0: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30  IR_PERMISSIONS 0
10e0: 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  755.#endif../*.*
10f0: 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  * Maximum suppor
1100: 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e  ted path-length.
1110: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
1120: 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a  PATHNAME 512../*
1130: 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68 65  .** Only set the
1140: 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74 68   lastErrno if th
1150: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1160: 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e 64  a real error and
1170: 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61   not .** a norma
1180: 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  l expected retur
1190: 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45  n code of SQLITE
11a0: 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f  _BUSY or SQLITE_
11b0: 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53  OK.*/.#define IS
11c0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20 20  _LOCK_ERROR(x)  
11d0: 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  ((x != SQLITE_OK
11e0: 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49 54  ) && (x != SQLIT
11f0: 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f 72  E_BUSY))../* For
1200: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
1210: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1220: 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53 68  t unixShm unixSh
1230: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1240: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73   /* Connection s
1250: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1260: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1270: 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78 53  nixShmNode unixS
1280: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a  hmNode;       /*
1290: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   Shared memory i
12a0: 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65 64  nstance */.typed
12b0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 49 6e  ef struct unixIn
12c0: 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f 64  odeInfo unixInod
12d0: 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20 69  eInfo;   /* An i
12e0: 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65 66  -node */.typedef
12f0: 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73   struct UnixUnus
1300: 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64 46  edFd UnixUnusedF
1310: 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75  d;     /* An unu
1320: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1330: 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f  tor */../*.** So
1340: 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20 61  metimes, after a
1350: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73 20   file handle is 
1360: 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74 65  closed by SQLite
1370: 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  , the file descr
1380: 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20  iptor.** cannot 
1390: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
13a0: 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65 20  ately. In these 
13b0: 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65 73  cases, instances
13c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
13d0: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61  g.** structure a
13e0: 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  re used to store
13f0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1400: 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74 69  ptor while waiti
1410: 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70  ng for an.** opp
1420: 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74 68  ortunity to eith
1430: 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75 73  er close or reus
1440: 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  e it..*/.struct 
1450: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a 20  UnixUnusedFd {. 
1460: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
1470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1480: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1490: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20   close */.  int 
14a0: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
14b0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
14c0: 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  his file descrip
14d0: 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 77  tor was opened w
14e0: 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  ith */.  UnixUnu
14f0: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20 20  sedFd *pNext;   
1500: 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65     /* Next unuse
1510: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1520: 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a  r on same file *
1530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
1540: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
1550: 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f  re is subclass o
1560: 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  f sqlite3_file s
1570: 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 75  pecific to the u
1580: 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65  nix.** VFS imple
1590: 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74  mentations..*/.t
15a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
15b0: 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b  ixFile unixFile;
15c0: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
15d0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f   {.  sqlite3_io_
15e0: 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
15f0: 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61  Method;  /* Alwa
1600: 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ys the first ent
1610: 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ry */.  sqlite3_
1620: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
1630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1640: 68 65 20 56 46 53 20 74 68 61 74 20 63 72 65 61  he VFS that crea
1650: 74 65 64 20 74 68 69 73 20 75 6e 69 78 46 69 6c  ted this unixFil
1660: 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  e */.  unixInode
1670: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20  Info *pInode;   
1680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1690: 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f  fo about locks o
16a0: 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  n this inode */.
16b0: 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20    int h;        
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
16e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
16f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1700: 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20  eFileLock;      
1710: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79 70        /* The typ
1720: 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  e of lock held o
1730: 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75  n this fd */.  u
1740: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e  nsigned short in
1750: 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20  t ctrlFlags;    
1760: 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c     /* Behavioral
1770: 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49 4c 45   bits.  UNIXFILE
1780: 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  _* flags */.  in
1790: 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  t lastErrno;    
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65 72    /* The unix er
17c0: 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f  rno from last I/
17d0: 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69  O error */.  voi
17e0: 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d *lockingContex
17f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1800: 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c   /* Locking styl
1810: 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  e specific state
1820: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
1830: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
1840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1850: 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78 55  -allocated UnixU
1860: 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e  nusedFd */.  con
1870: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20  st char *zPath; 
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18a0: 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
18b0: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d0: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73   Shared memory s
18e0: 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69  egment informati
18f0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68  on */.  int szCh
1900: 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  unk;            
1910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1920: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
1930: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
1940: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1950: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e  MMAP_SIZE>0.  in
1960: 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20  t nFetchOut;    
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1990: 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
19a0: 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69  h refs */.  sqli
19b0: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
19c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
19d0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
19e0: 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61  f mapping at pMa
19f0: 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  pRegion */.  sql
1a00: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
1a10: 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 20  izeActual;      
1a20: 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20   /* Actual size 
1a30: 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d  of mapping at pM
1a40: 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71  apRegion */.  sq
1a50: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1a60: 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20 20 20  SizeMax;        
1a70: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20    /* Configured 
1a80: 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20  FCNTL_MMAP_SIZE 
1a90: 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64 20  value */.  void 
1aa0: 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20  *pMapRegion;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ac0: 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  * Memory mapped 
1ad0: 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66  region */.#endif
1ae0: 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
1af0: 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  __.  int sectorS
1b00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
1b20: 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a  ce sector size *
1b30: 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65 43 68  /.  int deviceCh
1b40: 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 20 20  aracteristics;  
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 6f          /* Preco
1b60: 6d 70 75 74 65 64 20 64 65 76 69 63 65 20 63 68  mputed device ch
1b70: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
1b80: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6f 70  .#endif.  int op
1b90: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bb0: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1bc0: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1bd0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
1be0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1bf0: 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41  E || defined(__A
1c00: 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67 6e  PPLE__).  unsign
1c10: 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20 20 20  ed fsFlags;     
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c30: 20 63 61 63 68 65 64 20 64 65 74 61 69 6c 73 20   cached details 
1c40: 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20 2a 2f  from statfs() */
1c50: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
1c60: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
1c70: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
1c80: 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Id;          /* 
1c90: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a  Unique file ID *
1ca0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
1cb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1cc0: 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
1cd0: 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61 72   of variables ar
1ce0: 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20  e used to track 
1cf0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1d00: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
1d10: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62  ion counter in b
1d20: 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61  ytes 24-27 of da
1d30: 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65  tabase files are
1d40: 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68   updated.  ** wh
1d50: 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74 20  enever any part 
1d60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d70: 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73  changes.  An ass
1d80: 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c  ertion fault wil
1d90: 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20  l.  ** occur if 
1da0: 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  a file is update
1db0: 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75  d without also u
1dc0: 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e  pdating the tran
1dd0: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
1de0: 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73 74  nter.  This test
1df0: 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69   is made to avoi
1e00: 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73  d new problems s
1e10: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20  imilar to the.  
1e20: 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64  ** one described
1e30: 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38 34   by ticket #3584
1e40: 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  . .  */.  unsign
1e50: 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74  ed char transCnt
1e60: 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65  rChng;   /* True
1e70: 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
1e80: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion counter chan
1e90: 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ged */.  unsigne
1ea0: 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65 3b  d char dbUpdate;
1eb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ec0: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64  if any part of d
1ed0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
1ee0: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
1ef0: 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c  ed char inNormal
1f00: 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65  Write;   /* True
1f10: 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20   if in a normal 
1f20: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
1f30: 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  */..#endif..#ifd
1f40: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1f50: 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65   /* In test mode
1f60: 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  , increase the s
1f70: 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  ize of this stru
1f80: 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20 74  cture a bit so t
1f90: 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  hat .  ** it is 
1fa0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1fb0: 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65  struct CrashFile
1fc0: 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74   defined in test
1fd0: 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72  6.c..  */.  char
1fe0: 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23   aPadding[32];.#
1ff0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54 68 69  endif.};../* Thi
2000: 73 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  s variable holds
2010: 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20   the process id 
2020: 28 70 69 64 29 20 66 72 6f 6d 20 77 68 65 6e 20  (pid) from when 
2030: 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 28  the xRandomness(
2040: 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77 61 73 20  ).** method was 
2050: 63 61 6c 6c 65 64 2e 20 20 49 66 20 78 4f 70 65  called.  If xOpe
2060: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72  n() is called fr
2070: 6f 6d 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  om a different p
2080: 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a 20 69 6e  rocess id,.** in
2090: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 20  dicating that a 
20a0: 66 6f 72 6b 28 29 20 68 61 73 20 6f 63 63 75 72  fork() has occur
20b0: 72 65 64 2c 20 74 68 65 20 50 52 4e 47 20 77 69  red, the PRNG wi
20c0: 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a 2a 2f 0a  ll be reset..*/.
20d0: 73 74 61 74 69 63 20 69 6e 74 20 72 61 6e 64 6f  static int rando
20e0: 6d 6e 65 73 73 50 69 64 20 3d 20 30 3b 0a 0a 2f  mnessPid = 0;../
20f0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
2100: 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e 69 78  ues for the unix
2110: 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 20 62  File.ctrlFlags b
2120: 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69  itmask:.*/.#defi
2130: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  ne UNIXFILE_EXCL
2140: 20 20 20 20 20 20 20 20 30 78 30 31 20 20 20 20          0x01    
2150: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20   /* Connections 
2160: 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73  from one process
2170: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
2180: 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
2190: 20 20 20 20 20 20 30 78 30 32 20 20 20 20 20 2f        0x02     /
21a0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * Connection is 
21b0: 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  read only */.#de
21c0: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 45  fine UNIXFILE_PE
21d0: 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34 20 20  RSIST_WAL 0x04  
21e0: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
21f0: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66   WAL mode */.#if
2200: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2210: 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20 64 65  BLE_DIRSYNC.# de
2220: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
2230: 52 53 59 4e 43 20 20 20 20 30 78 30 38 20 20 20  RSYNC    0x08   
2240: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 73    /* Directory s
2250: 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ync needed */.#e
2260: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  lse.# define UNI
2270: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2280: 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23 64 65   0x00.#endif.#de
2290: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 50 53  fine UNIXFILE_PS
22a0: 4f 57 20 20 20 20 20 20 20 20 30 78 31 30 20 20  OW        0x10  
22b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
22c0: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
22d0: 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e  RWRITE */.#defin
22e0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  e UNIXFILE_DELET
22f0: 45 20 20 20 20 20 20 30 78 32 30 20 20 20 20 20  E      0x20     
2300: 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f  /* Delete on clo
2310: 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  se */.#define UN
2320: 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20 20 20  IXFILE_URI      
2330: 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a 20 46     0x40     /* F
2340: 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20 68 61  ilename might ha
2350: 76 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ve query paramet
2360: 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ers */.#define U
2370: 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20  NIXFILE_NOLOCK  
2380: 20 20 20 20 30 78 38 30 20 20 20 20 20 2f 2a 20      0x80     /* 
2390: 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  Do no file locki
23a0: 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng */.#define UN
23b0: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 20 20 20  IXFILE_WARNED   
23c0: 20 30 78 30 31 30 30 20 20 20 20 20 2f 2a 20 76   0x0100     /* v
23d0: 65 72 69 66 79 44 62 46 69 6c 65 28 29 20 68 61  erifyDbFile() ha
23e0: 73 20 69 73 73 75 65 64 20 77 61 72 6e 69 6e 67  s issued warning
23f0: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  s */.#define UNI
2400: 58 46 49 4c 45 5f 44 45 46 45 52 52 45 44 20 20  XFILE_DEFERRED  
2410: 30 78 30 32 30 30 20 20 20 20 20 2f 2a 20 46 69  0x0200     /* Fi
2420: 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
2430: 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 2f  een opened */../
2440: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
2450: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
2460: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
2470: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
2480: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
2490: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
24a0: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
24b0: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
24c0: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
24d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
24e0: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
24f0: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2500: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2510: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
2520: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
2530: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2540: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2550: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
2560: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
2570: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
2580: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
2590: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
25a0: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
25b0: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
25c0: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
25d0: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
25e0: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
25f0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
2600: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
2610: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
2620: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
2630: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
2640: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
2650: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
2660: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id 0.#endif../*.
2670: 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64  ** HAVE_MREMAP d
2680: 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20  efaults to true 
2690: 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c  on Linux and fal
26a0: 73 65 20 65 76 65 72 79 77 68 65 72 65 20 65 6c  se everywhere el
26b0: 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  se..*/.#if !defi
26c0: 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29  ned(HAVE_MREMAP)
26d0: 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  .# if defined(__
26e0: 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69  linux__) && defi
26f0: 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29  ned(_GNU_SOURCE)
2700: 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f  .#  define HAVE_
2710: 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a  MREMAP 1.# else.
2720: 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d  #  define HAVE_M
2730: 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a  REMAP 0.# endif.
2740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
2750: 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73  fferent Unix sys
2760: 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65  tems declare ope
2770: 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74  n() in different
2780: 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65   ways.  Same use
2790: 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  .** open(const c
27a0: 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29  har*,int,mode_t)
27b0: 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70  .  Others use op
27c0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
27d0: 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20  nt,...)..** The 
27e0: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d  difference is im
27f0: 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69  portant when usi
2800: 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
2810: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
2820: 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77  .** The safest w
2830: 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ay to deal with 
2840: 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
2850: 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69  o always use thi
2860: 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69  s wrapper.** whi
2870: 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68  ch always has th
2880: 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69  e same well-defi
2890: 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ned interface..*
28a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
28b0: 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  ixOpen(const cha
28c0: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c  r *zFile, int fl
28d0: 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a  ags, int mode){.
28e0: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46    return open(zF
28f0: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65  ile, flags, mode
2900: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73  );.}../*.** On s
2910: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c  ome systems, cal
2920: 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77  ls to fchown() w
2930: 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65  ill trigger a me
2940: 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72  ssage in a secur
2950: 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68  ity.** log if th
2960: 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e  ey come from non
2970: 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e  -root processes.
2980: 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69    So avoid calli
2990: 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a  ng fchown() if.*
29a0: 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e  * we are not run
29b0: 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f  ning as root..*/
29c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
29d0: 78 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20  xFchown(int fd, 
29e0: 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74  uid_t uid, gid_t
29f0: 20 67 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20   gid){.  return 
2a00: 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20  geteuid() ? 0 : 
2a10: 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69  fchown(fd,uid,gi
2a20: 64 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  d);.}../* Forwar
2a30: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
2a40: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
2a50: 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
2a60: 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a  ar*, int*);../*.
2a70: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
2a80: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
2a90: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
2aa0: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
2ab0: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
2ac0: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
2ad0: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
2ae0: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
2af0: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
2b00: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
2b10: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
2b20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
2b30: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
2b40: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
2b50: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
2b60: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
2b70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
2b80: 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c  uct unix_syscall
2b90: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
2ba0: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
2bb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2bc0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
2bd0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
2be0: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
2bf0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
2c00: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
2c10: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
2c20: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
2c30: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
2c40: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
2c50: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b  yscall[] = {.  {
2c60: 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20   "open",        
2c70: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2c80: 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c  l_ptr)posixOpen,
2c90: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2ca0: 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e  osOpen      ((in
2cb0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
2cc0: 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61  ,int,int))aSysca
2cd0: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
2ce0: 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20  .  { "close",   
2cf0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2d00: 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c  scall_ptr)close,
2d10: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
2d20: 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20  ine osClose     
2d30: 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53  ((int(*)(int))aS
2d40: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
2d50: 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73  nt)..  { "access
2d60: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
2d70: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63  3_syscall_ptr)ac
2d80: 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a  cess,     0  },.
2d90: 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73  #define osAccess
2da0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
2db0: 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53  st char*,int))aS
2dc0: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
2dd0: 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64  nt)..  { "getcwd
2de0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
2df0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65  3_syscall_ptr)ge
2e00: 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a  tcwd,     0  },.
2e10: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64  #define osGetcwd
2e20: 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63      ((char*(*)(c
2e30: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
2e40: 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e  scall[3].pCurren
2e50: 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20  t)..  { "stat", 
2e60: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2e70: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61  _syscall_ptr)sta
2e80: 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  t,       0  },.#
2e90: 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20  define osStat   
2ea0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2eb0: 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73  t char*,struct s
2ec0: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34  tat*))aSyscall[4
2ed0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a  ].pCurrent)../*.
2ee0: 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d  ** The DJGPP com
2ef0: 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e  piler environmen
2f00: 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c  t looks mostly l
2f10: 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74  ike Unix, but it
2f20: 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63  .** lacks the fc
2f30: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
2f40: 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20  l.  So redefine 
2f50: 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f  fcntl() to be so
2f60: 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20  mething.** that 
2f70: 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
2f80: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
2f90: 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e  t locking does n
2fa0: 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a  ot occur under.*
2fb0: 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74  * DJGPP.  But it
2fc0: 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64   is DOS - what d
2fd0: 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a  id you expect?.*
2fe0: 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50  /.#ifdef __DJGPP
2ff0: 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20  __.  { "fstat", 
3000: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
3010: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3020: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28  #define osFstat(
3030: 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73  a,b,c)    0.#els
3040: 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61  e     .  { "fsta
3050: 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  t",        (sqli
3060: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3070: 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d  fstat,      0  }
3080: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
3090: 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  t     ((int(*)(i
30a0: 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  nt,struct stat*)
30b0: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
30c0: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20  rrent).#endif.. 
30d0: 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20   { "ftruncate", 
30e0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
30f0: 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74  all_ptr)ftruncat
3100: 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  e,  0  },.#defin
3110: 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28  e osFtruncate ((
3120: 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74  int(*)(int,off_t
3130: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
3140: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
3150: 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71  ntl",        (sq
3160: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3170: 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20  r)fcntl,      0 
3180: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
3190: 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29  ntl     ((int(*)
31a0: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
31b0: 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65  yscall[7].pCurre
31c0: 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c  nt)..  { "read",
31d0: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
31e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65  3_syscall_ptr)re
31f0: 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  ad,       0  },.
3200: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20  #define osRead  
3210: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3220: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
3230: 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  t))aSyscall[8].p
3240: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3250: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3260: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3270: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3280: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
3290: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
32a0: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20  call_ptr)pread, 
32b0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
32c0: 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20  .  { "pread",   
32d0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
32e0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
32f0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3300: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
3310: 61 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ad     ((ssize_t
3320: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
3330: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
3340: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
3350: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
3360: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20  SE_PREAD64).  { 
3370: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
3380: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3390: 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20  _ptr)pread64,   
33a0: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
33b0: 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20   "pread64",     
33c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
33d0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
33e0: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
33f0: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34  define osPread64
3400: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
3410: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
3420: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
3430: 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [10].pCurrent)..
3440: 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20    { "write",    
3450: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3460: 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20  call_ptr)write, 
3470: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3480: 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28  ne osWrite     (
3490: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
34a0: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65  const void*,size
34b0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d  _t))aSyscall[11]
34c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
34d0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
34e0: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
34f0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3500: 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  E.  { "pwrite", 
3510: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3520: 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74  yscall_ptr)pwrit
3530: 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  e,     0  },.#el
3540: 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c  se.  { "pwrite",
3550: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3560: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3570: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
3580: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
3590: 77 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65  write    ((ssize
35a0: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
35b0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
35c0: 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20  _t))\.          
35d0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
35e0: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
35f0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
3600: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
3610: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
3620: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3630: 70 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20  ptr)pwrite64,   
3640: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3650: 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20  "pwrite64",     
3660: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3670: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3680: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3690: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34  efine osPwrite64
36a0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
36b0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
36c0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e     aSyscall[13].
36f0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3700: 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28  fchmod",       (
3710: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3720: 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20  ptr)fchmod,     
3730: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3740: 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28  Fchmod    ((int(
3750: 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61  *)(int,mode_t))a
3760: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
3770: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3780: 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
3790: 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
37a0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
37b0: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
37c0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
37d0: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f  scall_ptr)posix_
37e0: 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c  fallocate,  0 },
37f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c  .#else.  { "fall
3800: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
3810: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3820: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3830: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
3840: 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74  efine osFallocat
3850: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
3860: 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ff_t,off_t))aSys
3870: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
3880: 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22  t)..  { "unlink"
3890: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
38a0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c  _syscall_ptr)unl
38b0: 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30  ink,           0
38c0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e   },.#define osUn
38d0: 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29  link    ((int(*)
38e0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
38f0: 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72  yscall[16].pCurr
3900: 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44  ent)..  { "openD
3910: 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73  irectory",    (s
3920: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3930: 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  tr)openDirectory
3940: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  ,      0 },.#def
3950: 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  ine osOpenDirect
3960: 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e  ory ((int(*)(con
3970: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61  st char*,int*))a
3980: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
3990: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64 69  rent)..  { "mkdi
39a0: 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  r",        (sqli
39b0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
39c0: 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20 20  mkdir,          
39d0: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
39e0: 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74 28  Mkdir     ((int(
39f0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 6d  *)(const char*,m
3a00: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
3a10: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  18].pCurrent).. 
3a20: 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20 20   { "rmdir",     
3a30: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3a40: 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20 20  all_ptr)rmdir,  
3a50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3a60: 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20 20  efine osRmdir   
3a70: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3a80: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
3a90: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
3aa0: 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20    { "fchown",   
3ab0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3ac0: 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 46 63  call_ptr)posixFc
3ad0: 68 6f 77 6e 2c 20 20 20 20 20 30 20 7d 2c 0a 23  hown,     0 },.#
3ae0: 64 65 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20  define osFchown 
3af0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3b00: 75 69 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79  uid_t,gid_t))aSy
3b10: 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65  scall[20].pCurre
3b20: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
3b30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
3b40: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
3b50: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
3b60: 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 28   "mmap",       (
3b70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3b80: 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20 30 20  ptr)mmap,     0 
3b90: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61  },.#define osMma
3ba0: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
3bb0: 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e  d*,size_t,int,in
3bc0: 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  t,int,off_t))aSy
3bd0: 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65  scall[21].pCurre
3be0: 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e 6d 61 70  nt)..  { "munmap
3bf0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3c00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75  3_syscall_ptr)mu
3c10: 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 30  nmap,          0
3c20: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75   },.#define osMu
3c30: 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28  nmap ((void*(*)(
3c40: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
3c50: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72  yscall[22].pCurr
3c60: 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f 4d  ent)..#if HAVE_M
3c70: 52 45 4d 41 50 0a 20 20 7b 20 22 6d 72 65 6d 61  REMAP.  { "mrema
3c80: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
3c90: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
3ca0: 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  remap,          
3cb0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3cc0: 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28  mremap",       (
3cd0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3ce0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3cf0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3d00: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d 61  .#define osMrema
3d10: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
3d20: 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f 74  d*,size_t,size_t
3d30: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
3d40: 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[23].pCurrent)
3d50: 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20 2f 2a 20 45  .#endif..}; /* E
3d60: 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69  nd of the overri
3d70: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
3d80: 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  lls */../*.** Th
3d90: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
3da0: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
3db0: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
3dc0: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
3dd0: 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e  ** "unix" VFSes.
3de0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
3df0: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
3e00: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
3e10: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
3e20: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
3e30: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
3e40: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
3e50: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
3e60: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
3e70: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
3e80: 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d  nt unixSetSystem
3e90: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
3ea0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
3eb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
3ec0: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
3ed0: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
3ee0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
3ef0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3f00: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
3f10: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
3f20: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3f30: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
3f40: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
3f50: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
3f60: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
3f70: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
3f80: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
3f90: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
3fa0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
3fb0: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
3fc0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
3fd0: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
3fe0: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
3ff0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
4000: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
4010: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
4020: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
4030: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
4040: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
4050: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
4060: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
4070: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
4080: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
4090: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
40a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
40b0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
40c0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
40d0: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
40e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
40f0: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
4100: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
4110: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
4120: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
4130: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
4140: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
4150: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4160: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4170: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4180: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4190: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
41a0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
41b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
41c0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
41d0: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
41e0: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
41f0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
4200: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4210: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
4220: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
4230: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
4240: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
4250: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
4260: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4270: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
4280: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
4290: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
42a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
42b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
42c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
42d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
42e0: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
42f0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4300: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
4310: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
4320: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
4330: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
4340: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
4350: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
4360: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
4370: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
4380: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
4390: 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53  all_ptr unixGetS
43a0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
43b0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
43c0: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
43d0: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
43e0: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
43f0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
4400: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
4410: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
4420: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
4430: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
4440: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
4450: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
4460: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
4470: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
4480: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
4490: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
44a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
44b0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
44c0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
44d0: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
44e0: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
44f0: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
4500: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
4510: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
4520: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
4530: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
4540: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
4550: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
4560: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
4570: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
4580: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
4590: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
45a0: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
45b0: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
45c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
45d0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
45e0: 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  -1;..  UNUSED_PA
45f0: 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66  RAMETER(p);.  if
4600: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ( zName ){.    f
4610: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
4620: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b  ize(aSyscall)-1;
4630: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4640: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4650: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4660: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
4670: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b    }.  }.  for(i+
4680: 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  +; i<ArraySize(a
4690: 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a  Syscall); i++){.
46a0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
46b0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20  [i].pCurrent!=0 
46c0: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
46d0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  l[i].zName;.  }.
46e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
46f0: 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65  *.** Do not acce
4700: 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73 63  pt any file desc
4710: 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61 6e  riptor less than
4720: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e 20   this value, in 
4730: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a  order to avoid.*
4740: 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62 61  * opening databa
4750: 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66 69  se file using fi
4760: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
4770: 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79  hat are commonly
4780: 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74   used for .** st
4790: 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 75  andard input, ou
47a0: 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e  tput, and error.
47b0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
47c0: 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f  TE_MINIMUM_FILE_
47d0: 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65 66  DESCRIPTOR.# def
47e0: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  ine SQLITE_MINIM
47f0: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
4800: 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OR 3.#endif../*.
4810: 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29  ** Invoke open()
4820: 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c  .  Do so multipl
4830: 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69  e times, until i
4840: 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64  t either succeed
4850: 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f  s or.** fails fo
4860: 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74  r some reason ot
4870: 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a  her than EINTR..
4880: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
4890: 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20  e creation mode 
48a0: 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73 65  "m" is 0 then se
48b0: 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61  t it to the defa
48c0: 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74  ult for.** SQLit
48d0: 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  e.  The default 
48e0: 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  is SQLITE_DEFAUL
48f0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
4900: 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  NS (normally.** 
4910: 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69 65  0644) as modifie
4920: 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 20  d by the system 
4930: 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73 20  umask.  If m is 
4940: 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d  not 0, then.** m
4950: 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72 65  ake the file cre
4960: 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78  ation mode be ex
4970: 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67  actly m ignoring
4980: 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a   the umask..**.*
4990: 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74 65  * The m paramete
49a0: 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65  r will be non-ze
49b0: 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65  ro only when cre
49c0: 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75  ating -wal, -jou
49d0: 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68  rnal,.** and -sh
49e0: 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61 6e  m files.  We wan
49f0: 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f  t those files to
4a00: 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a 20   have *exactly* 
4a10: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d  the same.** perm
4a20: 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69 72  issions as their
4a30: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
4a40: 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74 65  se, unadulterate
4a50: 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
4a60: 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  ** In that way, 
4a70: 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  if a database fi
4a80: 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77 20  le is -rw-rw-rw 
4a90: 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e  or -rw-rw-r-, an
4aa0: 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  d a.** transacti
4ab0: 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20 6c  on crashes and l
4ac0: 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f 74  eaves behind hot
4ad0: 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
4ae0: 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74  any.** process t
4af0: 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20 77  hat is able to w
4b00: 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61  rite to the data
4b10: 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62  base will also b
4b20: 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63  e able to.** rec
4b30: 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f 75  over the hot jou
4b40: 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnals..*/.static
4b50: 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e   int robust_open
4b60: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
4b70: 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29  int f, mode_t m)
4b80: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f  {.  int fd;.  mo
4b90: 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20  de_t m2 = m ? m 
4ba0: 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  : SQLITE_DEFAULT
4bb0: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
4bc0: 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 23  S;.  while(1){.#
4bd0: 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f  if defined(O_CLO
4be0: 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20 6f  EXEC).    fd = o
4bf0: 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45  sOpen(z,f|O_CLOE
4c00: 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20  XEC,m2);.#else. 
4c10: 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a     fd = osOpen(z
4c20: 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  ,f,m2);.#endif. 
4c30: 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
4c40: 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d       if( errno==
4c50: 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75 65  EINTR ) continue
4c60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4c70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3e     }.    if( fd>
4c80: 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f  =SQLITE_MINIMUM_
4c90: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
4ca0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43  ) break;.    osC
4cb0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73 71  lose(fd);.    sq
4cc0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
4cd0: 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20  _WARNING, .     
4ce0: 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74 65             "atte
4cf0: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73  mpt to open \"%s
4d00: 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63 72  \" as file descr
4d10: 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64  iptor %d", z, fd
4d20: 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a  );.    fd = -1;.
4d30: 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28 22      if( osOpen("
4d40: 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d  /dev/null", f, m
4d50: 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  )<0 ) break;.  }
4d60: 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a  .  if( fd>=0 ){.
4d70: 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
4d80: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
4d90: 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20 20  t statbuf;.     
4da0: 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64 2c   if( osFstat(fd,
4db0: 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a 20   &statbuf)==0 . 
4dc0: 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75 66        && statbuf
4dd0: 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20  .st_size==0.    
4de0: 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e 73     && (statbuf.s
4df0: 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d 20  t_mode&0777)!=m 
4e00: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
4e10: 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d    osFchmod(fd, m
4e20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4e30: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44 5f  .#if defined(FD_
4e40: 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64 65  CLOEXEC) && (!de
4e50: 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29  fined(O_CLOEXEC)
4e60: 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30   || O_CLOEXEC==0
4e70: 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64  ).    osFcntl(fd
4e80: 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e  , F_SETFD, osFcn
4e90: 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
4ea0: 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
4eb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
4ec0: 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a  eturn fd;.}../*.
4ed0: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
4ee0: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
4ef0: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
4f00: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
4f10: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
4f20: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
4f30: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
4f40: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
4f50: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4f60: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
4f70: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
4f80: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
4f90: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
4fa0: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
4fb0: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
4fc0: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
4fd0: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
4fe0: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
4ff0: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
5000: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
5010: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5020: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
5030: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
5040: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
5050: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
5060: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
5070: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
5080: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
5090: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
50a0: 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ve().*/.static v
50b0: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
50c0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
50d0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
50e0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
50f0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
5100: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
5110: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
5120: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
5130: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
5140: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
5150: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
5160: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
5170: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
5180: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5190: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
51a0: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
51b0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
51c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
51d0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
51e0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
51f0: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
5200: 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69  endif...#if defi
5210: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
5220: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5230: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
5240: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
5250: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74  for printing out
5260: 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69   trace informati
5270: 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e  on from debuggin
5280: 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54  g.** binaries. T
5290: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
52a0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61  string represeta
52b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
52c0: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
52d0: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
52e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
52f0: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
5300: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
5310: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
5320: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
5330: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
5340: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
5350: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
5360: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
5370: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
5380: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
5390: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
53a0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
53b0: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
53c0: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
53d0: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
53e0: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
53f0: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
5400: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
5410: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
5420: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
5430: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
5440: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
5450: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
5460: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5470: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
5480: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
5490: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
54a0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
54b0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
54c0: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
54d0: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
54e0: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
54f0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
5500: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
5510: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
5520: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
5530: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
5540: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
5550: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
5560: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
5570: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
5580: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
5590: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
55a0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
55b0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
55c0: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
55d0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
55e0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
55f0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
5600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
5610: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
5620: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
5630: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
5640: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
5650: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
5660: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
5670: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
5680: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
5690: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
56a0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
56b0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
56c0: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
56d0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
56e0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
56f0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
5700: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
5710: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
5720: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
5730: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
5740: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
5750: 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e  T );.  s = osFcn
5760: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
5770: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
5780: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
5790: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
57a0: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
57b0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
57c0: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
57d0: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
57e0: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
57f0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
5800: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
5810: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
5820: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
5830: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
5840: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
5850: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
5860: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
5870: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
5880: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63  2 = *p;.    osFc
5890: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
58a0: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
58b0: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
58c0: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
58d0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
58e0: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
58f0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
5900: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
5910: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
5920: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
5930: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
5940: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
5950: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5960: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
5970: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5980: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
5990: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
59a0: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
59b0: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
59c0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
59d0: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
59e0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
59f0: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
5a00: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
5a10: 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66  turn s;.}.#undef
5a20: 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65   osFcntl.#define
5a30: 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61   osFcntl lockTra
5a40: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
5a50: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
5a60: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  /../*.** Retry f
5a70: 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73  truncate() calls
5a80: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
5a90: 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69  o EINTR.*/.stati
5aa0: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72  c int robust_ftr
5ab0: 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71  uncate(int h, sq
5ac0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b  lite3_int64 sz){
5ad0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
5ae0: 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74   rc = osFtruncat
5af0: 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28  e(h,sz); }while(
5b00: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
5b10: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
5b20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
5b30: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e  his routine tran
5b40: 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  slates a standar
5b50: 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f  d POSIX errno co
5b60: 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e  de into somethin
5b70: 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74  g.** useful to t
5b80: 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68  he clients of th
5b90: 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69  e sqlite3 functi
5ba0: 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ons.  Specifical
5bb0: 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74  ly, it is.** int
5bc0: 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61  ended to transla
5bd0: 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  te a variety of 
5be0: 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f  "try again" erro
5bf0: 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42  rs into SQLITE_B
5c00: 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72  USY.** and a var
5c10: 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20  iety of "please 
5c20: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
5c30: 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65  escriptor NOW" e
5c40: 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53  rrors into .** S
5c50: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a  QLITE_IOERR.** .
5c60: 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67  ** Errors during
5c70: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
5c80: 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c  of locks, or fil
5c90: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
5ca0: 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73   for locks,.** s
5cb0: 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f  hould handle ENO
5cc0: 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f  LCK, ENOTSUP, EO
5cd0: 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74  PNOTSUPP separat
5ce0: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
5cf0: 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72  nt sqliteErrorFr
5d00: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  omPosixError(int
5d10: 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74   posixError, int
5d20: 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a   sqliteIOErr) {.
5d30: 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45    switch (posixE
5d40: 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20  rror) {.#if 0.  
5d50: 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  /* At one point 
5d60: 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f  this code was no
5d70: 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e  t commented out.
5d80: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73   In theory, this
5d90: 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f   branch.  ** sho
5da0: 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74  uld never be hit
5db0: 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  , as this functi
5dc0: 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  on should only b
5dd0: 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20  e called after. 
5de0: 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65   ** a locking-re
5df0: 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28  lated function (
5e00: 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61  i.e. fcntl()) ha
5e10: 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a  s returned non-z
5e20: 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  ero with.  ** th
5e30: 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f  e value of errno
5e40: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
5e50: 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20  gument. Since a 
5e60: 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20  system call has 
5e70: 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72  failed,.  ** err
5e80: 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e  no should be non
5e90: 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  -zero..  **.  **
5ea0: 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69   Despite this, i
5eb0: 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69  f errno really i
5ec0: 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c  s zero, we still
5ed0: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
5ee0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
5ef0: 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d  E_OK. The system
5f00: 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e   call failed, an
5f10: 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20  d *some* SQLite 
5f20: 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a  error should be.
5f30: 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20    ** propagated 
5f40: 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c  back to the call
5f50: 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74  er. Commenting t
5f60: 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d  his branch out m
5f70: 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20  eans errno==0.  
5f80: 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c  ** will be handl
5f90: 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75  ed by the "defau
5fa0: 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e  lt:" case below.
5fb0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20  .  */.  case 0: 
5fc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5fd0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20  TE_OK;.#endif.. 
5fe0: 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20   case EAGAIN:.  
5ff0: 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a  case ETIMEDOUT:.
6000: 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20    case EBUSY:.  
6010: 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61  case EINTR:.  ca
6020: 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20  se ENOLCK:  .   
6030: 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72   /* random NFS r
6040: 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65  etry error, unle
6050: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
6060: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
6070: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
6080: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
6090: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
60a0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
60b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
60c0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63  E_BUSY;.    .  c
60d0: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20  ase EACCES: .   
60e0: 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69   /* EACCES is li
60f0: 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67  ke EAGAIN during
6100: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
6110: 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  ons, but not any
6120: 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20   other time*/.  
6130: 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45    if( (sqliteIOE
6140: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
6150: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  RR_LOCK) || .   
6160: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6170: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6180: 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  R_UNLOCK) || .  
6190: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
61a0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
61b0: 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20  RR_RDLOCK) ||.  
61c0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
61d0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
61e0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
61f0: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  LOCK) ){.      r
6200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
6210: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  Y;.    }.    /* 
6220: 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  else fall throug
6230: 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52  h */.  case EPER
6240: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
6250: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
6260: 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73  .  /* EDEADLK is
6270: 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
6280: 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74  f a call to fcnt
6290: 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d  l(F_SETLKW) is m
62a0: 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68  ade. And.  ** th
62b0: 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20  is module never 
62c0: 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61 6c  makes such a cal
62d0: 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65 20  l. And the code 
62e0: 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66  in SQLite itself
62f0: 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20 74   .  ** asserts t
6300: 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  hat SQLITE_IOERR
6310: 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76 65  _BLOCKED is neve
6320: 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 20  r returned. For 
6330: 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20 20  these reasons.  
6340: 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20  ** this case is 
6350: 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f  also commented o
6360: 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74 65  ut. If the syste
6370: 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e 6f  m does set errno
6380: 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a   to EDEADLK,.  *
6390: 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53 51  * the default SQ
63a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 63  LITE_IOERR_XXX c
63b0: 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ode will be retu
63c0: 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  rned. */.#if 0. 
63d0: 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20   case EDEADLK:. 
63e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
63f0: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
6400: 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 20  #endif.    .#if 
6410: 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54  EOPNOTSUPP!=ENOT
6420: 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f  SUP.  case EOPNO
6430: 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73  TSUPP: .    /* s
6440: 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65  omething went te
6450: 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c  rribly awry, unl
6460: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
6470: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
6480: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
6490: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
64a0: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
64b0: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
64c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45  .#endif.#ifdef E
64d0: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e  NOTSUP.  case EN
64e0: 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69  OTSUP: .    /* i
64f0: 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73  nvalid fd, unles
6500: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
6510: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74  stem support int
6520: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
6530: 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20  hich .     * it 
6540: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
6550: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23  hat it says */.#
6560: 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f  endif.  case EIO
6570: 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a  :.  case EBADF:.
6580: 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20    case EINVAL:. 
6590: 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a   case ENOTCONN:.
65a0: 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20    case ENODEV:. 
65b0: 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63   case ENXIO:.  c
65c0: 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64  ase ENOENT:.#ifd
65d0: 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20  ef ESTALE       
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
65f0: 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64   ESTALE is not d
6600: 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69  efined on Interi
6610: 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63  x systems */.  c
6620: 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64  ase ESTALE:.#end
6630: 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53  if.  case ENOSYS
6640: 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73  :.    /* these s
6650: 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20  hould force the 
6660: 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20  client to close 
6670: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63  the file and rec
6680: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20  onnect */.    . 
6690: 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72   default: .    r
66a0: 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72  eturn sqliteIOEr
66b0: 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  r;.  }.}.../****
66c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
6710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
6720: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
6730: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
6740: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
6750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
6760: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
6770: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
6780: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
6790: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
67a0: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
67b0: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
67c0: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
67d0: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
67e0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
67f0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
6800: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
6810: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
6820: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
6830: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
6840: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
6850: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
6860: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
6870: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
6880: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
6890: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
68a0: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
68b0: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
68c0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
68d0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
68e0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
68f0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
6900: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
6910: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
6920: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
6930: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
6940: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
6950: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
6960: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
6970: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
6980: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
6990: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
69a0: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
69b0: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
69c0: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
69d0: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
69e0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
69f0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
6a00: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
6a10: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
6a20: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
6a30: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
6a40: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6a50: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
6a60: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
6a70: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
6a80: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
6a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6aa0: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
6ab0: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
6ac0: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
6af0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
6b00: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
6b10: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
6b20: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
6b30: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
6b40: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
6b50: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
6b60: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
6b70: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
6b80: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
6b90: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
6ba0: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
6bb0: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
6bc0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
6bd0: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
6be0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
6bf0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
6c00: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
6c10: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
6c20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
6c30: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
6c40: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
6c50: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
6c60: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
6c70: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
6c80: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
6c90: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
6ca0: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
6cb0: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
6cc0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
6cd0: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
6ce0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
6cf0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
6d00: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
6d10: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
6d20: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
6d30: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
6d40: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
6d50: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
6d60: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
6d70: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
6d80: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
6d90: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
6da0: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
6db0: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
6dc0: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
6dd0: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
6de0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
6df0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
6e00: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
6e10: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6e20: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
6e30: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
6e40: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
6e50: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
6e60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6e80: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
6e90: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
6ea0: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
6eb0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
6ec0: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
6ed0: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
6ee0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
6ef0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
6f00: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
6f10: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6f20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6f30: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
6f40: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
6f50: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
6f60: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
6f70: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
6f80: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
6f90: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
6fa0: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
6fb0: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
6fc0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
6fd0: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
6fe0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
6ff0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
7000: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
7010: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
7020: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
7030: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
7040: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
7050: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
7060: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
7070: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
7080: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
7090: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
70a0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
70b0: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
70c0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
70d0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
70e0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
70f0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
7100: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
7110: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
7120: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
7130: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
7140: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
7150: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
7160: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
7170: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
7180: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7190: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
71a0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
71b0: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
71c0: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
71d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
71f0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
7200: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
7210: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
7220: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
7230: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
7240: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
7250: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
7260: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
7270: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
7280: 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66   + (n+1) );.  if
7290: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
72a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43  rn 0;.  pNew->zC
72b0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28  anonicalName = (
72c0: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
72d0: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
72e0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a  CanonicalName, z
72f0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b  AbsoluteName, n+
7300: 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b  1);.  n = vxwork
7310: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e  sSimplifyName(pN
7320: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7330: 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65  me, n);..  /* Se
7340: 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
7350: 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20  ting entry that 
7360: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e  matching the can
7370: 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a  onical name..  *
7380: 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72  * If found, incr
7390: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
73a0: 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65  nce count and re
73b0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
73c0: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74  o.  ** the exist
73d0: 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a  ing file ID..  *
73e0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
73f0: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e  ex();.  for(pCan
7400: 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69  didate=vxworksFi
7410: 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61  leList; pCandida
7420: 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70  te; pCandidate=p
7430: 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74  Candidate->pNext
7440: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64  ){.    if( pCand
7450: 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20  idate->nName==n 
7460: 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28  .     && memcmp(
7470: 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e  pCandidate->zCan
7480: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77  onicalName, pNew
7490: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
74a0: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  , n)==0.    ){. 
74b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
74c0: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
74d0: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65   pCandidate->nRe
74e0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78  f++;.       unix
74f0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
7500: 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e       return pCan
7510: 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  didate;.    }.  
7520: 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68  }..  /* No match
7530: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20   was found.  We 
7540: 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20  will make a new 
7550: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65  file ID */.  pNe
7560: 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  w->nRef = 1;.  p
7570: 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a  New->nName = n;.
7580: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
7590: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
75a0: 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  .  vxworksFileLi
75b0: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69  st = pNew;.  uni
75c0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
75d0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
75e0: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
75f0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
7600: 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b  ount on a vxwork
7610: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
7620: 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a   Free.** the obj
7630: 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66  ect when the ref
7640: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
7650: 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  ches zero..*/.st
7660: 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b  atic void vxwork
7670: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73  sReleaseFileId(s
7680: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
7690: 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69  eId *pId){.  uni
76a0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
76b0: 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52   assert( pId->nR
76c0: 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e  ef>0 );.  pId->n
76d0: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64  Ref--;.  if( pId
76e0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
76f0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
7700: 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20  ileId **pp;.    
7710: 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46  for(pp=&vxworksF
7720: 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20  ileList; *pp && 
7730: 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26  *pp!=pId; pp = &
7740: 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b  ((*pp)->pNext)){
7750: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  }.    assert( *p
7760: 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70  p==pId );.    *p
7770: 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a  p = pId->pNext;.
7780: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7790: 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  (pId);.  }.  uni
77a0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
77b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
77c0: 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  WORKS */./******
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
77e0: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
77f0: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
7800: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
7810: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
7820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7860: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
7870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
78a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
78b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
78c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
78d0: 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76  ****** Posix Adv
78e0: 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  isory Locking **
78f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
7910: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
7920: 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e  locks are broken
7930: 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53   by design.  ANS
7940: 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39  I STD 1003.1 (19
7950: 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36  96).** section 6
7960: 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33  .5.2.2 lines 483
7970: 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65   through 490 spe
7980: 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61  cify that when a
7990: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73   process.** sets
79a0: 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63   or clears a loc
79b0: 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f  k, that operatio
79c0: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
79d0: 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a  prior locks set.
79e0: 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ** by the same p
79f0: 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73  rocess.  It does
7a00: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
7a10: 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73  say so, but this
7a20: 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74   implies.** that
7a30: 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f   it overrides lo
7a40: 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73  cks set by the s
7a50: 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e  ame process usin
7a60: 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  g a different.**
7a70: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7a80: 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
7a90: 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a   test case:.**.*
7aa0: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20  *       int fd1 
7ab0: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22  = open("./file1"
7ac0: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
7ad0: 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20  , 0644);.**     
7ae0: 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e    int fd2 = open
7af0: 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44  ("./file2", O_RD
7b00: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
7b10: 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  );.**.** Suppose
7b20: 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66   ./file1 and ./f
7b30: 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20  ile2 are really 
7b40: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62  the same file (b
7b50: 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73  ecause.** one is
7b60: 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f   a hard or symbo
7b70: 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20  lic link to the 
7b80: 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79  other) then if y
7b90: 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63  ou set.** an exc
7ba0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66  lusive lock on f
7bb0: 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  d1, then try to 
7bc0: 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  get an exclusive
7bd0: 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c   lock.** on fd2,
7be0: 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f   it works.  I wo
7bf0: 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65  uld have expecte
7c00: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63  d the second loc
7c10: 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e  k to.** fail sin
7c20: 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72  ce there was alr
7c30: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  eady a lock on t
7c40: 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66  he file due to f
7c50: 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73  d1..** But not s
7c60: 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c  o.  Since both l
7c70: 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74  ocks came from t
7c80: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c  he same process,
7c90: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f   the.** second o
7ca0: 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72  verrides the fir
7cb0: 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  st, even though 
7cc0: 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66  they were on dif
7cd0: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
7ce0: 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
7cf0: 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66  d on different f
7d00: 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a  ile names..**.**
7d10: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
7d20: 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50   we cannot use P
7d30: 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79  OSIX locks to sy
7d40: 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61  nchronize file a
7d50: 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63  ccess.** among c
7d60: 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73  ompeting threads
7d70: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f   of the same pro
7d80: 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63  cess.  POSIX loc
7d90: 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ks will work fin
7da0: 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e  e.** to synchron
7db0: 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74  ize access for t
7dc0: 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61  hreads in separa
7dd0: 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75  te processes, bu
7de0: 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  t not.** threads
7df0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
7e00: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
7e10: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
7e20: 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69  he problem, SQLi
7e30: 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65  te has to manage
7e40: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65   file locks inte
7e50: 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73  rnally.** on its
7e60: 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20   own.  Whenever 
7e70: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
7e80: 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76  s opened, we hav
7e90: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  e to find the.**
7ea0: 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20   specific inode 
7eb0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7ec0: 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20  file (the inode 
7ed0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
7ee0: 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61   the.** st_dev a
7ef0: 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73  nd st_ino fields
7f00: 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72   of the stat str
7f10: 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61  ucture that fsta
7f20: 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a  t() fills in).**
7f30: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c   and check for l
7f40: 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69  ocks already exi
7f50: 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e  sting on that in
7f60: 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73  ode.  When locks
7f70: 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   are.** created 
7f80: 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68  or removed, we h
7f90: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f  ave to look at o
7fa0: 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20  ur own internal 
7fb0: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a  record of the.**
7fc0: 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66   locks to see if
7fd0: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
7fe0: 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  has previously s
7ff0: 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61  et a lock on tha
8000: 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e  t same.** inode.
8010: 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54  .**.** (Aside: T
8020: 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20  he use of inode 
8030: 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75  numbers as uniqu
8040: 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77  e IDs does not w
8050: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
8060: 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20  ** For VxWorks, 
8070: 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74  we have to use t
8080: 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75  he alternative u
8090: 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20  nique ID system 
80a0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f  based on.** cano
80b0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61  nical filename a
80c0: 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  nd implemented i
80d0: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64  n the previous d
80e0: 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20  ivision.).**.** 
80f0: 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  The sqlite3_file
8100: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50   structure for P
8110: 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  OSIX is no longe
8120: 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65  r just an intege
8130: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
8140: 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77  ptor.  It is now
8150: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
8160: 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65  t holds the inte
8170: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
8180: 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69  riptor and a poi
8190: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74  nter to a struct
81a0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
81b0: 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  es the internal.
81c0: 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ** locks on the 
81d0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
81e0: 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ode.  There is o
81f0: 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ne locking struc
8200: 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64  ture.** per inod
8210: 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d  e, so if the sam
8220: 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65  e inode is opene
8230: 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e  d twice, both un
8240: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
8250: 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  s.** point to th
8260: 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73  e same locking s
8270: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c  tructure.  The l
8280: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
8290: 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65   keeps.** a refe
82a0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20  rence count (so 
82b0: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
82c0: 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20  n to delete it) 
82d0: 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66  and a "cnt".** f
82e0: 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20  ield that tells 
82f0: 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  us its internal 
8300: 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e  lock status.  cn
8310: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a  t==0 means the.*
8320: 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  * file is unlock
8330: 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61  ed.  cnt==-1 mea
8340: 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ns the file has 
8350: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
8360: 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e  k..** cnt>0 mean
8370: 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20  s there are cnt 
8380: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20  shared locks on 
8390: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
83a0: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  Any attempt to l
83b0: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20  ock or unlock a 
83c0: 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b  file first check
83d0: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  s the locking.**
83e0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
83f0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
8400: 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76  call is only inv
8410: 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a  oked to set a .*
8420: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20  * POSIX lock if 
8430: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  the internal loc
8440: 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  k structure tran
8450: 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  sitions between.
8460: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20  ** a locked and 
8470: 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74  an unlocked stat
8480: 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69  e..**.** But wai
8490: 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65  t:  there are ye
84a0: 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20  t more problems 
84b0: 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73  with POSIX advis
84c0: 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  ory locks..**.**
84d0: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
84e0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
84f0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
8500: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
8510: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
8520: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
8530: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
8540: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
8550: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
8560: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
8570: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
8580: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e  lem, each unixIn
8590: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  odeInfo object.*
85a0: 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f  * maintains a co
85b0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
85c0: 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63  r of pending loc
85d0: 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e  ks on tha inode.
85e0: 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65  .** When an atte
85f0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
8600: 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65  lose an unixFile
8610: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  , if there are.*
8620: 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65  * other unixFile
8630: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
8640: 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65  e inode that are
8650: 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20   holding locks, 
8660: 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63  the call.** to c
8670: 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20  lose() the file 
8680: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65  descriptor is de
8690: 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c  ferred until all
86a0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c   of the locks cl
86b0: 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ear..** The unix
86c0: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
86d0: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
86e0: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
86f0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
8700: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
8710: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
8720: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
8730: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
8740: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
8750: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
8760: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
8770: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
8780: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
8790: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
87a0: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
87b0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
87c0: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
87d0: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
87e0: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
87f0: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
8800: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
8810: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
8820: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
8830: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
8840: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
8850: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
8860: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
8870: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
8880: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
8890: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
88a0: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
88b0: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
88c0: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
88d0: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
88e0: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
88f0: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
8900: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
8910: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
8920: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
8930: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
8940: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
8950: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
8960: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
8970: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
8980: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
8990: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
89a0: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
89b0: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
89c0: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
89d0: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
89e0: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
89f0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
8a00: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
8a10: 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75  e has to do a ru
8a20: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
8a30: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
8a40: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
8a50: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
8a60: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
8a70: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69  ed to support Li
8a80: 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74  nuxThreads.  But
8a90: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e   support for Lin
8aa0: 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73  uxThreads.** was
8ab0: 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69   dropped beginni
8ac0: 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20  ng with version 
8ad0: 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77  3.7.0.  SQLite w
8ae0: 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77  ill still work w
8af0: 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65  ith.** LinuxThre
8b00: 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61  ads provided tha
8b10: 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e  t (1) there is n
8b20: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
8b30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70  connection .** p
8b40: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
8b50: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
8b60: 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74  cess and (2) dat
8b70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8b80: 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65  s.** do not move
8b90: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e   across threads.
8ba0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
8bb0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
8bc0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
8bd0: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
8be0: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
8bf0: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
8c00: 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ar unixInodeInfo
8c10: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75   object..*/.stru
8c20: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a  ct unixFileId {.
8c30: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c50: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
8c60: 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
8c70: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
8c80: 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f  sFileId *pId;  /
8c90: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
8ca0: 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f   for vxworks. */
8cb0: 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69  .#else.  ino_t i
8cc0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
8cd0: 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75       /* Inode nu
8ce0: 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  mber */.#endif.}
8cf0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
8d00: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
8d10: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
8d20: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
8d30: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
8d40: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
8d50: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
8d60: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
8d70: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
8d80: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
8d90: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
8da0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
8db0: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
8dc0: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
8dd0: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
8de0: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
8df0: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
8e00: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
8e10: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
8e20: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
8e30: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
8e40: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
8e50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
8e60: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
8e70: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
8e80: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
8e90: 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  {.  struct unixF
8ea0: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
8eb0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75      /* The looku
8ec0: 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  p key */.  int n
8ed0: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20  Shared;         
8ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8ef0: 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c  mber of SHARED l
8f00: 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
8f10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69  nsigned char eFi
8f20: 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f  leLock;        /
8f30: 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f  * One of SHARED_
8f40: 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
8f50: 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e  OCK etc. */.  un
8f60: 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f  signed char bPro
8f70: 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a  cessLock;     /*
8f80: 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72   An exclusive pr
8f90: 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65  ocess lock is he
8fa0: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ld */.  int nRef
8fb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8fc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8fd0: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
8fe0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
8ff0: 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
9000: 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
9010: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
9020: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
9030: 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65   with this inode
9040: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b   */.  int nLock;
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9060: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9070: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66  of outstanding f
9080: 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55  ile locks */.  U
9090: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
90a0: 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  used;          /
90b0: 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65  * Unused file de
90c0: 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f  scriptors to clo
90d0: 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  se */.  unixInod
90e0: 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20  eInfo *pNext;   
90f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
9100: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
9110: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Info objects */.
9120: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9130: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
9140: 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75    /*    .... dou
9150: 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69  bly linked */.#i
9160: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9170: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
9180: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
9190: 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20  ng sharedByte;  
91a0: 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c  /* for AFP simul
91b0: 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b  ated shared lock
91c0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
91d0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f  S_VXWORKS.  sem_
91e0: 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20  t *pSem;        
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9200: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
9210: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
9220: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
9230: 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d  NAME+2];  /* Nam
9240: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
9250: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ore */.#endif.};
9260: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20  ../*.** A lists 
9270: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
9280: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  Info objects..*/
9290: 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64  .static unixInod
92a0: 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74  eInfo *inodeList
92b0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   = 0;../*.**.** 
92c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
92d0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29  unixLogError_x()
92e0: 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  , is only ever c
92f0: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
9300: 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72  cro.** unixLogEr
9310: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ror()..**.** It 
9320: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
9330: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9340: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
9350: 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73  on and errno has
9360: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74   been.** set. It
9370: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
9380: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
9390: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
93a0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
93b0: 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64   of.** errno and
93c0: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
93d0: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
93e0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
93f0: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a  m strerror() or.
9400: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  ** strerror_r().
9410: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
9420: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
9430: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
9440: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
9450: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
9460: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
9470: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
9480: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
9490: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
94a0: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
94b0: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
94c0: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
94d0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
94e0: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
94f0: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e  at.** failed (e.
9500: 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70  g. "unlink", "op
9510: 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73 73  en") and the ass
9520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73  ociated file-sys
9530: 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20  tem path,.** if 
9540: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
9550: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62  unixLogError(a,b
9560: 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45  ,c)     unixLogE
9570: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
9580: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
9590: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72  c int unixLogErr
95a0: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
95b0: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
95d0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
95e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
95f0: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
9600: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
9610: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
9620: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
9630: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9650: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
9660: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
9670: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
96a0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
96b0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
96c0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
96d0: 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Err;            
96e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73           /* Mess
96f0: 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  age from strerro
9700: 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e  r() or equivalen
9710: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e  t */.  int iErrn
9720: 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20  o = errno;      
9730: 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
9740: 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75  syscall error nu
9750: 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  mber */..  /* If
9760: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
9770: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20  hreadsafe build 
9780: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
9790: 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65  FE==0), then use
97a0: 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72  .  ** the strerr
97b0: 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  or() function to
97c0: 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61   obtain the huma
97d0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n-readable error
97e0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71   message.  ** eq
97f0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e  uivalent to errn
9800: 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  o. Otherwise, us
9810: 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  e strerror_r()..
9820: 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45    */ .#if SQLITE
9830: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
9840: 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45  efined(HAVE_STRE
9850: 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61  RROR_R).  char a
9860: 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65  Err[80];.  memse
9870: 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f  t(aErr, 0, sizeo
9880: 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72  f(aErr));.  zErr
9890: 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49   = aErr;..  /* I
98a0: 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  f STRERROR_R_CHA
98b0: 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f  R_P (set by auto
98c0: 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72  conf scripts) or
98d0: 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65   __USE_GNU is de
98e0: 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75  fined,.  ** assu
98f0: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
9900: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
9910: 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  GNU version of s
9920: 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74  trerror_r() that
9930: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
9940: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
9950: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
9960: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
9970: 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a  . That pointer .
9980: 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74    ** may point t
9990: 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20  o aErr[], or it 
99a0: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  may point to som
99b0: 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65  e static storage
99c0: 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a   somewhere. .  *
99d0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73  * Otherwise, ass
99e0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
99f0: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
9a00: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f   POSIX version o
9a10: 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72  f .  ** strerror
9a20: 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61  _r(), which alwa
9a30: 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72  ys writes an err
9a40: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20  or message into 
9a50: 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  aErr[]..  **.  *
9a60: 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e  * If the code in
9a70: 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65  correctly assume
9a80: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
9a90: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74   POSIX version t
9aa0: 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69  hat is.  ** avai
9ab0: 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72  lable, the error
9ac0: 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66   message will of
9ad0: 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20  ten be an empty 
9ae0: 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20  string. Not a.  
9af0: 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e  ** huge problem.
9b00: 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e   Incorrectly con
9b10: 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65  cluding that the
9b20: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20   GNU version is 
9b30: 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20  available .  ** 
9b40: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
9b50: 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e  segfault though.
9b60: 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
9b70: 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  d(STRERROR_R_CHA
9b80: 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  R_P) || defined(
9b90: 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72  __USE_GNU).  zEr
9ba0: 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73  r = .# endif.  s
9bb0: 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f  trerror_r(iErrno
9bc0: 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61  , aErr, sizeof(a
9bd0: 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20  Err)-1);..#elif 
9be0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
9bf0: 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  E.  /* This is a
9c00: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
9c10: 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f  d, but strerror_
9c20: 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  r() is not avail
9c30: 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  able. */.  zErr 
9c40: 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  = "";.#else.  /*
9c50: 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20   Non-threadsafe 
9c60: 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72  build, use strer
9c70: 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72  ror(). */.  zErr
9c80: 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72   = strerror(iErr
9c90: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  no);.#endif..  i
9ca0: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
9cb0: 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69  ath = "";.  sqli
9cc0: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
9cd0: 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e  .      "os_unix.
9ce0: 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73  c:%d: (%d) %s(%s
9cf0: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
9d00: 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46  Line, iErrno, zF
9d10: 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72  unc, zPath, zErr
9d20: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
9d30: 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errcode;.}../*.*
9d40: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  * Close a file d
9d50: 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
9d60: 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   We assume that 
9d70: 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61  close() almost a
9d80: 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e  lways works, sin
9d90: 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e  ce it is only in
9da0: 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20   a.** very sick 
9db0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f  application or o
9dc0: 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c  n a very sick pl
9dd0: 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d  atform that it m
9de0: 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66  ight fail..** If
9df0: 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73   it does fail, s
9e00: 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66  imply leak the f
9e10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
9e20: 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a  but do log the.*
9e30: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e  * error..**.** N
9e40: 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e  ote that it is n
9e50: 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79  ot safe to retry
9e60: 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45   close() after E
9e70: 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a  INTR since the.*
9e80: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
9e90: 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72  r might have alr
9ea0: 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64  eady been reused
9eb0: 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65   by another thre
9ec0: 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e  ad..** So we don
9ed0: 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72  't even try to r
9ee0: 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45  ecover from an E
9ef0: 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20  INTR.  Just log 
9f00: 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64  the error.** and
9f10: 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61   move on..*/.sta
9f20: 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f  tic void robust_
9f30: 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  close(unixFile *
9f40: 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e  pFile, int h, in
9f50: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28  t lineno){.  if(
9f60: 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20   osClose(h) ){. 
9f70: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
9f80: 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45  tLine(SQLITE_IOE
9f90: 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65  RR_CLOSE, "close
9fa0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9fb0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20            pFile 
9fc0: 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a  ? pFile->zPath :
9fd0: 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d   0, lineno);.  }
9fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
9ff0: 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
a000: 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20  tors accumuated 
a010: 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  in the unixInode
a020: 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69  Info->pUnused li
a030: 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  st..*/ .static v
a040: 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  oid closePending
a050: 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Fds(unixFile *pF
a060: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
a070: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
a080: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
a090: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
a0a0: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
a0b0: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
a0c0: 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  =pInode->pUnused
a0d0: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
a0e0: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
a0f0: 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  ext;.    robust_
a100: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e  close(pFile, p->
a110: 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
a120: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a130: 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65  p);.  }.  pInode
a140: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
a150: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
a160: 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  a unixInodeInfo 
a170: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
a180: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
a190: 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  y findInodeInfo(
a1a0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
a1b0: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
a1c0: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
a1d0: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
a1e0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
a1f0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a200: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
a210: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
a220: 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69  aseInodeInfo(uni
a230: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
a240: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a250: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
a260: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
a270: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
a280: 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
a290: 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20  S(pInode) ){.   
a2a0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b   pInode->nRef--;
a2b0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
a2c0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
a2d0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
a2e0: 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b  ->pShmNode==0 );
a2f0: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
a300: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
a310: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
a320: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
a330: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
a340: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
a350: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
a360: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d    pInode->pPrev-
a370: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
a380: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
a390: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
a3a0: 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d  ert( inodeList==
a3b0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
a3c0: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
a3d0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
a3e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a3f0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a  Inode->pNext ){.
a400: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a410: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
a420: 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Prev==pInode );.
a430: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
a440: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
a450: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20  Inode->pPrev;.  
a460: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a470: 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29  te3_free(pInode)
a480: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
a490: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
a4a0: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
a4b0: 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f  cate the unixIno
a4c0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  deInfo object th
a4d0: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
a4e0: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
a4f0: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
a500: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
a510: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
a520: 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74  turn value might
a530: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
a540: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
a550: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
a560: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
a570: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
a580: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
a590: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
a5a0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
a5b0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
a5c0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
a5d0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
a5e0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
a5f0: 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49  c int findInodeI
a600: 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  nfo(.  unixFile 
a610: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
a620: 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
a630: 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73  le with file des
a640: 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  c used in the ke
a650: 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  y */.  unixInode
a660: 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20  Info **ppInode  
a670: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
a680: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
a690: 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f  o object here */
a6a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
a6d0: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
a6e0: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
a710: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
a720: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
a730: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
a740: 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b  Id;      /* Look
a750: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
a760: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a  nixInodeInfo */.
a770: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
a780: 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
a790: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
a7a0: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
a7b0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
a7c0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20  o *pInode = 0;  
a7d0: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
a7e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
a7f0: 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ject */..  asser
a800: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
a810: 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  () );..  /* Get 
a820: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
a830: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
a840: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
a850: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
a860: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
a870: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
a880: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
a890: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73  le->h;.  rc = os
a8a0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
a8b0: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
a8c0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
a8d0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
a8e0: 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c  ;.#ifdef EOVERFL
a8f0: 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  OW.    if( pFile
a900: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
a910: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
a920: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
a930: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
a940: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
a950: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
a960: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
a970: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
a980: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
a990: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
a9a0: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
a9b0: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
a9c0: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
a9d0: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
a9e0: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
a9f0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
aa00: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
aa10: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
aa20: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
aa30: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
aa40: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
aa50: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
aa60: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
aa70: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
aa80: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
aa90: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
aaa0: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
aab0: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
aac0: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
aad0: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
aae0: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
aaf0: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
ab00: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
ab10: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
ab20: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
ab30: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
ab40: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
ab50: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
ab60: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
ab70: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
ab80: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
ab90: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
aba0: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
abb0: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
abc0: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
abd0: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
abe0: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
abf0: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
ac00: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
ac10: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
ac20: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
ac30: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
ac40: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
ac50: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
ac60: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
ac70: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
ac80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ac90: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
aca0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
acb0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
acc0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
acd0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
ace0: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
acf0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
ad00: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
ad10: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
ad20: 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c   memset(&fileId,
ad30: 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49   0, sizeof(fileI
ad40: 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65  d));.  fileId.de
ad50: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
ad60: 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  ev;.#if OS_VXWOR
ad70: 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20  KS.  fileId.pId 
ad80: 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65  = pFile->pId;.#e
ad90: 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f  lse.  fileId.ino
ada0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e   = statbuf.st_in
adb0: 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f  o;.#endif.  pIno
adc0: 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
add0: 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
ade0: 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49  && memcmp(&fileI
adf0: 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  d, &pInode->file
ae00: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
ae10: 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  d)) ){.    pInod
ae20: 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
ae30: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  t;.  }.  if( pIn
ae40: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  ode==0 ){.    pI
ae50: 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  node = sqlite3_m
ae60: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
ae70: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
ae80: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
ae90: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
aea0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
aeb0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64      memset(pInod
aec0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  e, 0, sizeof(*pI
aed0: 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63  node));.    memc
aee0: 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  py(&pInode->file
aef0: 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a  Id, &fileId, siz
af00: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
af10: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d    pInode->nRef =
af20: 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   1;.    pInode->
af30: 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73  pNext = inodeLis
af40: 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  t;.    pInode->p
af50: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66  Prev = 0;.    if
af60: 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e  ( inodeList ) in
af70: 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  odeList->pPrev =
af80: 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f   pInode;.    ino
af90: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b  deList = pInode;
afa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
afb0: 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  node->nRef++;.  
afc0: 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70  }.  *ppInode = p
afd0: 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  Inode;.  return 
afe0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
aff0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
b000: 69 66 20 70 46 69 6c 65 20 68 61 73 20 62 65 65  if pFile has bee
b010: 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c  n renamed or unl
b020: 69 6e 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77  inked since it w
b030: 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
b040: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
b050: 69 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78  ileHasMoved(unix
b060: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
b070: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
b080: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
b090: 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a 20 20  >pInode!=0 &&.  
b0a0: 20 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70         (osStat(p
b0b0: 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75  File->zPath, &bu
b0c0: 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74 5f  f)!=0 || buf.st_
b0d0: 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f  ino!=pFile->pIno
b0e0: 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b  de->fileId.ino);
b0f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
b100: 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61 74   a unixFile that
b110: 20 69 73 20 61 20 64 61 74 61 62 61 73 65 2e 20   is a database. 
b120: 20 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c 6c   Verify the foll
b130: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29  owing:.**.** (1)
b140: 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
b150: 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20  y one hard link 
b160: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28  on the file.** (
b170: 32 29 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  2) The file is n
b180: 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  ot a symbolic li
b190: 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66 69  nk.** (3) The fi
b1a0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
b1b0: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
b1c0: 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20  ked.**.** Issue 
b1d0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b1e0: 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20  TE_WARNING,...) 
b1f0: 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e 79 74  messages if anyt
b200: 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67 68  hing is not righ
b210: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
b220: 64 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 75  d verifyDbFile(u
b230: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
b240: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
b250: 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  uf;.  int rc;.  
b260: 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
b270: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b280: 57 41 52 4e 45 44 20 29 7b 0a 20 20 20 20 2f 2a  WARNED ){.    /*
b290: 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   One or more of 
b2a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61  the following wa
b2b0: 72 6e 69 6e 67 73 20 68 61 76 65 20 61 6c 72 65  rnings have alre
b2c0: 61 64 79 20 62 65 65 6e 20 69 73 73 75 65 64 2e  ady been issued.
b2d0: 20 20 44 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20    Do not.    ** 
b2e0: 72 65 70 65 61 74 20 74 68 65 6d 20 73 6f 20 61  repeat them so a
b2f0: 73 20 6e 6f 74 20 74 6f 20 63 6c 75 74 74 65 72  s not to clutter
b300: 20 74 68 65 20 65 72 72 6f 72 20 6c 6f 67 20 2a   the error log *
b310: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
b320: 7d 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  }.  rc = osFstat
b330: 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
b340: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
b350: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
b360: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
b370: 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74 20 64   "cannot fstat d
b380: 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46 69 6c  b file %s", pFil
b390: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
b3a0: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b3b0: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
b3c0: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
b3d0: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
b3e0: 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70 46  _nlink==0 && (pF
b3f0: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
b400: 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
b410: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
b420: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b430: 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e  ARNING, "file un
b440: 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65  linked while ope
b450: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
b460: 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65  Path);.    pFile
b470: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
b480: 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a  NIXFILE_WARNED;.
b490: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b4a0: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
b4b0: 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  nk>1 ){.    sqli
b4c0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b4d0: 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70 6c  ARNING, "multipl
b4e0: 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65 3a  e links to file:
b4f0: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
b500: 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  th);.    pFile->
b510: 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
b520: 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20  XFILE_WARNED;.  
b530: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b540: 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65 64  if( fileHasMoved
b550: 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 73  (pFile) ){.    s
b560: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
b570: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65  E_WARNING, "file
b580: 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20 6f   renamed while o
b590: 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d  pen: %s", pFile-
b5a0: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69  >zPath);.    pFi
b5b0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
b5c0: 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44   UNIXFILE_WARNED
b5d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b5e0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  }.}.../*.** This
b5f0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
b600: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
b610: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
b620: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
b630: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
b640: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
b650: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
b660: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
b670: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
b680: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
b690: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
b6a0: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
b6b0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
b6c0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
b6d0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
b6e0: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
b6f0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
b700: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
b710: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
b720: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
b730: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
b740: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
b750: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
b760: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
b770: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
b780: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
b790: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
b7a0: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
b7b0: 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
b7c0: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
b7d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
b7e0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
b7f0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65   );..  if( pFile
b800: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
b810: 49 58 46 49 4c 45 5f 44 45 46 45 52 52 45 44 20  IXFILE_DEFERRED 
b820: 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
b830: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
b840: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
b850: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
b860: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
b870: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
b880: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
b890: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
b8a0: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
b8b0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
b8c0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
b8d0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
b8e0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
b8f0: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
b900: 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
b910: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
b920: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
b930: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
b940: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
b950: 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47  */.#ifndef __DJG
b960: 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65  PP__.  if( !rese
b970: 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e  rved && !pFile->
b980: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
b990: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75  Lock ){.    stru
b9a0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
b9b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
b9c0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
b9d0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
b9e0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
b9f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
ba00: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
ba10: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
ba20: 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46    if( osFcntl(pF
ba30: 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  ile->h, F_GETLK,
ba40: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
ba50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
ba60: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
ba70: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
ba80: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
ba90: 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
baa0: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
bab0: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
bac0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
bad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
bae0: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
baf0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
bb00: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
bb10: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
bb20: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
bb30: 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
bb40: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
bb50: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
bb60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
bb70: 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73  tempt to set a s
bb80: 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68  ystem-lock on th
bb90: 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54  e file pFile.  T
bba0: 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64  he lock is .** d
bbb0: 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63  escribed by pLoc
bbc0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
bbd0: 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  pFile was opened
bbe0: 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d   read/write from
bbf0: 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e   unix-excl, then
bc00: 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a   the only lock.*
bc10: 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20  * ever obtained 
bc20: 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  is an exclusive 
bc30: 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20  lock, and it is 
bc40: 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79  obtained exactly
bc50: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72   once.** the fir
bc60: 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b  st time any lock
bc70: 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20   is attempted.  
bc80: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73  All subsequent s
bc90: 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  ystem locking.**
bca0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f   operations beco
bcb0: 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b  me no-ops.  Lock
bcc0: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73  ing operations s
bcd0: 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65  till happen inte
bce0: 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72  rnally,.** in or
bcf0: 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  der to coordinat
bd00: 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e  e access between
bd10: 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61   separate databa
bd20: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
bd30: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72  * within this pr
bd40: 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f  ocess, but all o
bd50: 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65  f that is handle
bd60: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20  d in memory and 
bd70: 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  the.** operating
bd80: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
bd90: 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a   participate..**
bda0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bdb0: 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f  n is a pass-thro
bdc0: 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53  ugh to fcntl(F_S
bdd0: 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69  ETLK) if pFile i
bde0: 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56  s using.** any V
bdf0: 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75  FS other than "u
be00: 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20  nix-excl" or if 
be10: 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  pFile is opened 
be20: 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a  on "unix-excl".*
be30: 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e  * and is read-on
be40: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ly..**.** Zero i
be50: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
be60: 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73  e call completes
be70: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f   successfully, o
be80: 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a  r -1 if a call.*
be90: 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69  * to fcntl() fai
bea0: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
beb0: 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61  , errno is set a
bec0: 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79  ppropriately (by
bed0: 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74   fcntl())..*/.st
bee0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
bef0: 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  eLock(unixFile *
bf00: 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c  pFile, struct fl
bf10: 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69  ock *pLock){.  i
bf20: 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f  nt rc;.  unixIno
bf30: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
bf40: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
bf50: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
bf60: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61  texHeld() );.  a
bf70: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30  ssert( pInode!=0
bf80: 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c   );.  if( ((pFil
bf90: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
bfa0: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30  NIXFILE_EXCL)!=0
bfb0: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f   || pInode->bPro
bfc0: 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20  cessLock).   && 
bfd0: 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ((pFile->ctrlFla
bfe0: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44  gs & UNIXFILE_RD
bff0: 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ONLY)==0).  ){. 
c000: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
c010: 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
c020: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66  {.      struct f
c030: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20  lock lock;.     
c040: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
c050: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  >nLock==0 );.   
c060: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
c070: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
c080: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c090: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
c0a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
c0b0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c0c0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
c0d0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
c0e0: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
c0f0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
c100: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, &lock);.     
c110: 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75   if( rc<0 ) retu
c120: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e  rn rc;.      pIn
c130: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
c140: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  k = 1;.      pIn
c150: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
c160: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
c170: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
c180: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f  else{.    rc = o
c190: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
c1a0: 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29   F_SETLK, pLock)
c1b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
c1c0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
c1d0: 20 75 6e 69 78 4f 70 65 6e 28 73 71 6c 69 74 65   unixOpen(sqlite
c1e0: 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68  3_vfs*, const ch
c1f0: 61 72 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c  ar*, sqlite3_fil
c200: 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 29 3b  e*, int, int *);
c210: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c220: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
c230: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
c240: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
c250: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
c260: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c270: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
c280: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
c290: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
c2a0: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
c2b0: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
c2c0: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
c2d0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
c2e0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
c2f0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
c300: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
c310: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
c320: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
c330: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
c340: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
c350: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
c360: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
c370: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
c380: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
c390: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
c3a0: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
c3b0: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
c3c0: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
c3d0: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
c3e0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
c3f0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
c400: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
c410: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
c420: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
c430: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
c440: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
c450: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
c460: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
c470: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
c480: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
c490: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
c4a0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
c4b0: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
c4c0: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
c4d0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
c4e0: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
c4f0: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
c500: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
c510: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
c520: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
c530: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
c540: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
c550: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
c560: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a  eFileLock){.  /*
c570: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
c580: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
c590: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
c5a0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
c5b0: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
c5c0: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
c5d0: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
c5e0: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
c5f0: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
c600: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
c610: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
c620: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
c630: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
c640: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
c650: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
c660: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
c670: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
c680: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
c690: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
c6a0: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
c6b0: 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f  tible with windo
c6c0: 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  ws systems simul
c6d0: 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
c6e0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
c6f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
c700: 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
c710: 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
c720: 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
c730: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
c740: 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
c750: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
c760: 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
c770: 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
c780: 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
c790: 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
c7a0: 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
c7b0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
c7c0: 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
c7d0: 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
c7e0: 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
c7f0: 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
c800: 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
c810: 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
c820: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
c830: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
c840: 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
c850: 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
c860: 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ul, a random byt
c870: 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72  e from the 'shar
c880: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
c890: 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b  ge' is read-lock
c8a0: 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ed and the lock 
c8b0: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
c8c0: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a  byte' released..
c8d0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
c8e0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
c8f0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
c900: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
c910: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a   a SHARED lock..
c920: 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20    ** A RESERVED 
c930: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
c940: 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20  ted by grabbing 
c950: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
c960: 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76  the.  ** 'reserv
c970: 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a  ed byte'. .  **.
c980: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
c990: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
c9a0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66   PENDING lock af
c9b0: 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69  ter it has obtai
c9c0: 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45  ned a.  ** SHARE
c9d0: 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e  D lock. A PENDIN
c9e0: 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  G lock is implem
c9f0: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
ca00: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a  ng a write-lock.
ca10: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e    ** on the 'pen
ca20: 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73  ding byte'. This
ca30: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
ca40: 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b   new SHARED lock
ca50: 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62  s can be.  ** ob
ca60: 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73  tained, but exis
ca70: 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b  ting SHARED lock
ca80: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
ca90: 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63   persist. A proc
caa0: 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  ess.  ** does no
cab0: 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e  t have to obtain
cac0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
cad0: 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61   on the way to a
cae0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20   PENDING lock.. 
caf0: 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74   ** This propert
cb00: 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  y is used by the
cb10: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72   algorithm for r
cb20: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
cb30: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
cb40: 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20  after a crash.. 
cb50: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c   **.  ** An EXCL
cb60: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61  USIVE lock, obta
cb70: 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e  ined after a PEN
cb80: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c  DING lock is hel
cb90: 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65  d, is.  ** imple
cba0: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
cbb0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
cbc0: 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27   on the entire '
cbd0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
cbe0: 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61   range'. Since a
cbf0: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72  ll other locks r
cc00: 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f  equire a read-lo
cc10: 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ck on one of the
cc20: 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68   bytes.  ** with
cc30: 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74  in this range, t
cc40: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
cc50: 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20   no other locks 
cc60: 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  are held on the.
cc70: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a    ** database. .
cc80: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65    **.  ** The re
cc90: 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  ason a single by
cca0: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  te cannot be use
ccb0: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
ccc0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
ccd0: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61  ** range' is tha
cce0: 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  t some versions 
ccf0: 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f  of windows do no
cd00: 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c  t support read-l
cd10: 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f  ocks. By.  ** lo
cd20: 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62  cking a random b
cd30: 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65  yte from a range
cd40: 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41  , concurrent SHA
cd50: 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78  RED locks may ex
cd60: 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  ist.  ** even if
cd70: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69   the locking pri
cd80: 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61  mitive used is a
cd90: 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f  lways a write-lo
cda0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ck..  */.  int r
cdb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
cdc0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
cdd0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
cde0: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
cdf0: 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72  o *pInode;.  str
ce00: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
ce10: 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30    int tErrno = 0
ce20: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
ce30: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
ce40: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
ce50: 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
ce60: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
ce70: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
ce80: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
ce90: 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
cea0: 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
ceb0: 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ck),.      azFil
cec0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e  eLock(pFile->pIn
ced0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ode->eFileLock),
cee0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
cef0: 6e 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64  nShared , getpid
cf00: 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ()));..  /* If t
cf10: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
cf20: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
cf30: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
cf40: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
cf50: 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
cf60: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
cf70: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
cf80: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
cf90: 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
cfa0: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
cfb0: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
cfc0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
cfd0: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
cfe0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
cff0: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
d000: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
d010: 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c  held) (unix)\n",
d020: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
d030: 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
d040: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
d050: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d060: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
d070: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
d080: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 46  s & UNIXFILE_DEF
d090: 45 52 52 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERRED ){.    int
d0a0: 20 65 4f 72 69 67 4c 6f 63 6b 20 3d 20 70 46 69   eOrigLock = pFi
d0b0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
d0c0: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
d0d0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
d0e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 74 72  .      int statr
d0f0: 63 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  c;.      struct 
d100: 73 74 61 74 20 73 42 75 66 3b 0a 20 20 20 20 20  stat sBuf;.     
d110: 20 6d 65 6d 73 65 74 28 26 73 42 75 66 2c 20 30   memset(&sBuf, 0
d120: 2c 20 73 69 7a 65 6f 66 28 73 42 75 66 29 29 3b  , sizeof(sBuf));
d130: 0a 20 20 20 20 20 20 73 74 61 74 72 63 20 3d 20  .      statrc = 
d140: 6f 73 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50  osStat(pFile->zP
d150: 61 74 68 2c 20 26 73 42 75 66 29 3b 0a 20 20 20  ath, &sBuf);.   
d160: 20 20 20 69 66 28 20 73 74 61 74 72 63 20 26 26     if( statrc &&
d170: 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29   errno==ENOENT )
d180: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
d190: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
d1a0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
d1b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d1c0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
d1d0: 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  }..    rc = unix
d1e0: 4f 70 65 6e 28 70 46 69 6c 65 2d 3e 70 56 66 73  Open(pFile->pVfs
d1f0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  , pFile->zPath, 
d200: 69 64 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46  id, pFile->openF
d210: 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66  lags, 0);.    if
d220: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d230: 26 26 20 65 4f 72 69 67 4c 6f 63 6b 20 29 7b 0a  && eOrigLock ){.
d240: 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
d250: 6f 63 6b 28 69 64 2c 20 65 4f 72 69 67 4c 6f 63  ock(id, eOrigLoc
d260: 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  k);.    }.    if
d270: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d280: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
d290: 0a 20 20 61 73 73 65 72 74 28 20 28 70 46 69 6c  .  assert( (pFil
d2a0: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
d2b0: 4e 49 58 46 49 4c 45 5f 44 45 46 45 52 52 45 44  NIXFILE_DEFERRED
d2c0: 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  )==0 );..  /* Ma
d2d0: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
d2e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
d2f0: 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28  correct..  **  (
d300: 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
d310: 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
d320: 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
d330: 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
d340: 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
d350: 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
d360: 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
d370: 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
d380: 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
d390: 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
d3a0: 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
d3b0: 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
d3c0: 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
d3d0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
d3e0: 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
d3f0: 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
d400: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
d410: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
d420: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
d430: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
d440: 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
d450: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
d460: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d470: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
d480: 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
d490: 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
d4a0: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
d4b0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
d4c0: 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
d4d0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
d4e0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
d4f0: 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  node;..  /* If s
d500: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
d510: 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
d520: 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
d530: 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
d540: 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
d550: 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
d560: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
d570: 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
d580: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46    if( (pFile->eF
d590: 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d  ileLock!=pInode-
d5a0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20  >eFileLock && . 
d5b0: 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65           (pInode
d5c0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
d5d0: 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  DING_LOCK || eFi
d5e0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
d5f0: 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  CK)).  ){.    rc
d600: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
d610: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
d620: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
d630: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
d640: 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
d650: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
d660: 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
d670: 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
d680: 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
d690: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
d6a0: 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
d6b0: 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
d6c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d6d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
d6e0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d6f0: 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70  OCK && .      (p
d700: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
d710: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
d720: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
d730: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
d740: 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
d750: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
d760: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
d770: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
d780: 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
d790: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
d7a0: 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
d7b0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
d7c0: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
d7d0: 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
d7e0: 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
d7f0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
d800: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
d810: 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20  k;.  }...  /* A 
d820: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
d830: 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
d840: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
d850: 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
d860: 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
d870: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
d880: 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
d890: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
d8a0: 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
d8b0: 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
d8c0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
d8d0: 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  1L;.  lock.l_whe
d8e0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
d8f0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d900: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
d910: 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63      || (eFileLoc
d920: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
d930: 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
d940: 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f  eLock<PENDING_LO
d950: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63  CK).  ){.    loc
d960: 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c  k.l_type = (eFil
d970: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d980: 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c  CK?F_RDLCK:F_WRL
d990: 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  CK);.    lock.l_
d9a0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
d9b0: 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e  BYTE;.    if( un
d9c0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
d9d0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
d9e0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
d9f0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
da00: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
da10: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
da20: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
da30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
da40: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
da50: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
da60: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
da70: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
da80: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
da90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a      }.  }...  /*
daa0: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
dab0: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
dac0: 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
dad0: 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
dae0: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
daf0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
db00: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
db10: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
db20: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
db30: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
db40: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
db50: 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
db60: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
db70: 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
db80: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
db90: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
dba0: 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
dbb0: 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read-lock */.   
dbc0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
dbd0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
dbe0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
dbf0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
dc00: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
dc10: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
dc20: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
dc30: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
dc40: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
dc50: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
dc60: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
dc70: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a  R_LOCK);.    }..
dc80: 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
dc90: 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
dca0: 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  G lock */.    lo
dcb0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
dcc0: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
dcd0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
dce0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
dcf0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69  = F_UNLCK;.    i
dd00: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
dd10: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26  pFile, &lock) &&
dd20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
dd30: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
dd40: 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74  could happen wit
dd50: 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e  h a network moun
dd60: 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e  t */.      tErrn
dd70: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
dd80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
dd90: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20  RR_UNLOCK; .    
dda0: 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  }..    if( rc ){
ddb0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
ddc0: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
ddd0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
dde0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
ddf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
de00: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
de10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
de20: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
de30: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
de40: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
de50: 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
de60: 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
de70: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
de80: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
de90: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
dea0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
deb0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
dec0: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
ded0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
dee0: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
def0: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
df00: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
df10: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
df20: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
df30: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
df40: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
df50: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
df60: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
df70: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
df80: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
df90: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
dfa0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
dfb0: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
dfc0: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
dfd0: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
dfe0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
dff0: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
e000: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
e010: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
e020: 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73  _WRLCK;..    ass
e030: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
e040: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
e050: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
e060: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
e070: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
e080: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
e090: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
e0a0: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
e0b0: 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  BYTE;.      lock
e0c0: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
e0d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f   }else{.      lo
e0e0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
e0f0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
e100: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
e110: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  ARED_SIZE;.    }
e120: 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ..    if( unixFi
e130: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
e140: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
e150: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e160: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
e170: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
e180: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
e190: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
e1a0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
e1b0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
e1c0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
e1d0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
e1e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e1f0: 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .  ..#ifdef SQLI
e200: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65  TE_DEBUG.  /* Se
e210: 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  t up the transac
e220: 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61  tion-counter cha
e230: 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61  nge checking fla
e240: 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61  gs when.  ** tra
e250: 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
e260: 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45  a SHARED to a RE
e270: 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68  SERVED lock.  Th
e280: 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72  e change.  ** fr
e290: 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  om SHARED to RES
e2a0: 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20  ERVED marks the 
e2b0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e  beginning of a n
e2c0: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65  ormal.  ** write
e2d0: 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20   operation (not 
e2e0: 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  a hot journal ro
e2f0: 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20  llback)..  */.  
e300: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e310: 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65  K.   && pFile->e
e320: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
e330: 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c  _LOCK.   && eFil
e340: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
e350: 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46  LOCK.  ){.    pF
e360: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
e370: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ng = 0;.    pFil
e380: 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  e->dbUpdate = 0;
e390: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
e3a0: 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20  rmalWrite = 1;. 
e3b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66   }.#endif...  if
e3c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e3d0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
e3e0: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
e3f0: 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
e400: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
e410: 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
e420: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
e430: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
e440: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
e450: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
e460: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
e470: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
e480: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
e490: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  .end_lock:.  uni
e4a0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
e4b0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
e4c0: 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69     %d %s %s (uni
e4d0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
e4e0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
e4f0: 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72  eLock), .      r
e500: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
e510: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
e520: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e530: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  ../*.** Add the 
e540: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
e550: 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e  used by file han
e560: 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65  dle pFile to the
e570: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
e580: 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a  * pUnused list..
e590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
e5a0: 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78  etPendingFd(unix
e5b0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
e5c0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
e5d0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
e5e0: 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75  Inode;.  UnixUnu
e5f0: 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65  sedFd *p = pFile
e600: 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e  ->pUnused;.  p->
e610: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
e620: 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64  pUnused;.  pInod
e630: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a  e->pUnused = p;.
e640: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
e650: 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  .  pFile->pUnuse
e660: 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d = 0;.}../*.** 
e670: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
e680: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
e690: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
e6a0: 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
e6b0: 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
e6c0: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
e6d0: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
e6e0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
e6f0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
e700: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
e710: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
e720: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
e730: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
e740: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
e750: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
e760: 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  o-op..** .** If 
e770: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
e780: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e  is true, then on
e790: 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20   downgrading an 
e7a0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74  EXCLUSIVE_LOCK t
e7b0: 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20  o SHARED.** the 
e7c0: 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69  byte range is di
e7d0: 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72  vided into 2 par
e7e0: 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ts and the first
e7f0: 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65   part is unlocke
e800: 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f  d then.** set to
e810: 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68   a read lock, th
e820: 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72  en the other par
e830: 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f  t is simply unlo
e840: 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b  cked.  This work
e850: 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62  s .** around a b
e860: 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f  ug in BSD NFS lo
e870: 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f  ckd (also seen o
e880: 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20  n MacOSX 10.3+) 
e890: 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a  that fails to .*
e8a0: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69  * remove the wri
e8b0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67  te lock on a reg
e8c0: 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20  ion when a read 
e8d0: 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  lock is set..*/.
e8e0: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
e8f0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
e900: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
e910: 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64  leLock, int hand
e920: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20  leNFSUnlock){.  
e930: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
e940: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
e950: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
e960: 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75   *pInode;.  stru
e970: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
e980: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e990: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
e9a0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
e9b0: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
e9c0: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
e9d0: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
e9e0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
e9f0: 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46  leLock,.      pF
ea00: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
ea10: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
ea20: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
ea30: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
ea40: 2c 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29  ,.      getpid()
ea50: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
ea60: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
ea70: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
ea80: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
ea90: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
eaa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eab0: 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
eac0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  terMutex();.  if
ead0: 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
eae0: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
eaf0: 46 45 52 52 45 44 20 29 20 67 6f 74 6f 20 65 6e  FERRED ) goto en
eb00: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 70 49 6e 6f  d_unlock;.  pIno
eb10: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
eb20: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  de;.  assert( pI
eb30: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30  node->nShared!=0
eb40: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
eb50: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
eb60: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
eb70: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
eb80: 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e  ileLock==pFile->
eb90: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69  eFileLock );..#i
eba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
ebb0: 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
ebc0: 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
ebd0: 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
ebe0: 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
ebf0: 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
ec00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ec10: 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
ec20: 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
ec30: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
ec40: 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
ec50: 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
ec60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
ec70: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
ec80: 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
ec90: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
eca0: 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
ecb0: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
ecc0: 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
ecd0: 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
ece0: 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
ecf0: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
ed00: 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
ed10: 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
ed20: 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
ed30: 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
ed40: 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
ed50: 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
ed60: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
ed70: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
ed80: 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d     */.    pFile-
ed90: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
eda0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
edb0: 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74  /* downgrading t
edc0: 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
edd0: 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20  on NFS involves 
ede0: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69  clearing the wri
edf0: 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62  te lock.    ** b
ee00: 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69  efore establishi
ee10: 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20  ng the readlock 
ee20: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63  - to avoid a rac
ee30: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64  e condition we d
ee40: 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20  owngrade.    ** 
ee50: 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c  the lock in 2 bl
ee60: 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61  ocks, so that pa
ee70: 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  rt of the range 
ee80: 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20  will be covered 
ee90: 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69  by a .    ** wri
eea0: 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68  te lock until th
eeb0: 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65  e rest is covere
eec0: 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b  d by a read lock
eed0: 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b  :.    **  1:   [
eee0: 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32  WWWWW].    **  2
eef0: 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20  :   [....W].    
ef00: 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d  **  3:   [RRRRW]
ef10: 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52  .    **  4:   [R
ef20: 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20  RRR.].    */.   
ef30: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
ef40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a  SHARED_LOCK ){..
ef50: 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41  #if !defined(__A
ef60: 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49  PPLE__) || !SQLI
ef70: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
ef80: 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76  G_STYLE.      (v
ef90: 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  oid)handleNFSUnl
efa0: 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ock;.      asser
efb0: 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  t( handleNFSUnlo
efc0: 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ck==0 );.#endif.
efd0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
efe0: 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
eff0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
f000: 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
f010: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
f020: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  ){.        int t
f030: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
f040: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
f050: 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63  de from system c
f060: 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  all errors */.  
f070: 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53        off_t divS
f080: 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  ize = SHARED_SIZ
f090: 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a  E - 1;.        .
f0a0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
f0b0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
f0c0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
f0d0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
f0e0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f0f0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
f100: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
f110: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69  ck.l_len = divSi
f120: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
f130: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f140: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
f150: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
f160: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f170: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f180: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
f190: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f1a0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
f1b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
f1c0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f1d0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
f1e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f1f0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
f200: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
f210: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
f220: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
f230: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
f240: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
f250: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
f260: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
f270: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f280: 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
f290: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
f2a0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
f2b0: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
f2c0: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
f2d0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
f2e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f2f0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
f300: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
f310: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
f320: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f330: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
f340: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
f350: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f360: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
f370: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f380: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
f390: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
f3a0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
f3b0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
f3c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
f3d0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
f3e0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
f3f0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
f400: 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  T+divSize;.     
f410: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
f420: 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53  SHARED_SIZE-divS
f430: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
f440: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
f450: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
f460: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
f470: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f480: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
f490: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
f4a0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
f4b0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
f4c0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
f4d0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
f4e0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
f4f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f500: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
f510: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
f520: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
f530: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
f540: 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
f550: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
f560: 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b  STYLE */.      {
f570: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f580: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
f590: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
f5a0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
f5b0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
f5c0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
f5d0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
f5e0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
f5f0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  ED_SIZE;.       
f600: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
f610: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
f620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
f630: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
f640: 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c  all to unixFileL
f650: 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  ock() cannot fai
f660: 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65  l because anothe
f670: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  r.          ** p
f680: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
f690: 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  g an incompatibl
f6a0: 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f  e lock. If it do
f6b0: 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  es, this .      
f6c0: 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73      ** indicates
f6d0: 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
f6e0: 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
f6f0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63  ollowing the loc
f700: 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  king.          *
f710: 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74  * protocol. If t
f720: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74  his happens, ret
f730: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
f740: 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69  _RDLOCK. Returni
f750: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
f760: 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c  SQLITE_BUSY woul
f770: 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70  d confuse the up
f780: 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72  per layer (in pr
f790: 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73  actice it causes
f7a0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
f7b0: 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c  n assert to fail
f7c0: 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20  ). */ .         
f7d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f7e0: 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_RDLOCK;.     
f7f0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
f800: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f810: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
f820: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
f830: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f840: 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  }.    lock.l_typ
f850: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
f860: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f870: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
f880: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
f890: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
f8a0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b  lock.l_len = 2L;
f8b0: 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e    assert( PENDIN
f8c0: 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56  G_BYTE+1==RESERV
f8d0: 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69  ED_BYTE );.    i
f8e0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f8f0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
f900: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
f910: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
f920: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
f930: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
f940: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
f950: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
f960: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
f970: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rrno;.      goto
f980: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
f990: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69   }.  }.  if( eFi
f9a0: 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
f9b0: 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  ){.    /* Decrem
f9c0: 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
f9d0: 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
f9e0: 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
f9f0: 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
fa00: 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
fa10: 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
fa20: 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
fa30: 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
fa40: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
fa50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
fa60: 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
fa70: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
fa80: 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
fa90: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
faa0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
fab0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
fac0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
fad0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
fae0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
faf0: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
fb00: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
fb10: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
fb20: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
fb30: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
fb40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fb50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
fb60: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
fb70: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
fb80: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
fb90: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
fba0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
fbb0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
fbc0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
fbd0: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
fbe0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
fbf0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
fc00: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
fc10: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
fc20: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
fc30: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
fc40: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
fc50: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
fc60: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
fc70: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
fc80: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
fc90: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
fca0: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
fcb0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
fcc0: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
fcd0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
fce0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
fcf0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
fd00: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
fd10: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
fd20: 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e     }.  }..end_un
fd30: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
fd40: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
fd50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
fd60: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
fd70: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
fd80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fd90: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
fda0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
fdb0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
fdc0: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
fdd0: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
fde0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
fdf0: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
fe00: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
fe10: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
fe20: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
fe30: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
fe40: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
fe50: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
fe60: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
fe70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
fe80: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
fe90: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
fea0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
feb0: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
fec0: 63 6b 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ck){.#if SQLITE_
fed0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
fee0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
fef0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ff00: 20 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a   || ((unixFile *
ff10: 29 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  )id)->nFetchOut=
ff20: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  =0 );.#endif.  r
ff30: 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63  eturn posixUnloc
ff40: 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  k(id, eFileLock,
ff50: 20 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   0);.}..#if SQLI
ff60: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
ff70: 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  >0.static int un
ff80: 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  ixMapfile(unixFi
ff90: 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79  le *pFd, i64 nBy
ffa0: 74 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  te);.static void
ffb0: 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75   unixUnmapfile(u
ffc0: 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23  nixFile *pFd);.#
ffd0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
ffe0: 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
fff0: 72 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66  rms the parts of
10000 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65   the "close file
10010 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20  " operation .** 
10020 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
10030 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49  cking schemes. I
10040 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72  t closes the dir
10050 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a  ectory and file.
10060 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74  ** handles, if t
10070 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61  hey are valid, a
10080 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c  nd sets all fiel
10090 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ds of the unixFi
100a0 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
100b0 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  to 0..**.** It i
100c0 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72  s *not* necessar
100d0 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  y to hold the mu
100e0 74 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f  tex when this ro
100f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
10100 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f  .** even on VxWo
10110 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69  rks.  A mutex wi
10120 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f  ll be acquired o
10130 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65  n VxWorks by the
10140 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  .** vxworksRelea
10150 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69  seFileId() routi
10160 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
10170 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  t closeUnixFile(
10180 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10190 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
101a0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
101b0 2a 29 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45  *)id;.#if SQLITE
101c0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
101d0 0a 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  .  unixUnmapfile
101e0 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
101f0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
10200 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f  0 ){.    robust_
10210 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69  close(pFile, pFi
10220 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  le->h, __LINE__)
10230 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ;.    pFile->h =
10240 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f   -1;.  }.#if OS_
10250 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46  VXWORKS.  if( pF
10260 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20  ile->pId ){.    
10270 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
10280 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
10290 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20  DELETE ){.      
102a0 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e  osUnlink(pFile->
102b0 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
102c0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
102d0 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
102e0 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29  leId(pFile->pId)
102f0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64  ;.    pFile->pId
10300 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
10310 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
10320 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
10330 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
10340 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
10350 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
10360 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d  e->pUnused);.  m
10370 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
10380 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
10390 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
103a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
103b0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
103c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
103d0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
103e0 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
103f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10400 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
10410 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
10420 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c  d;.  verifyDbFil
10430 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78  e(pFile);.  unix
10440 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
10450 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  CK);.  unixEnter
10460 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75  Mutex();..  /* u
10470 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69  nixFile.pInode i
10480 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68  s always valid h
10490 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ere. Otherwise, 
104a0 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73  a different clos
104b0 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28  e.  ** routine (
104c0 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  e.g. nolockClose
104d0 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c  ()) would be cal
104e0 6c 65 64 20 69 6e 73 74 65 61 64 2e 20 20 2a 2f  led instead.  */
104f0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
10500 2d 3e 70 49 6e 6f 64 65 3d 3d 30 20 0a 20 20 20  ->pInode==0 .   
10510 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49      || pFile->pI
10520 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 0a 20  node->nLock>0 . 
10530 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
10540 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
10550 4c 6f 63 6b 3d 3d 30 20 0a 20 20 29 3b 0a 20 20  Lock==0 .  );.  
10560 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
10570 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  e ){.    if( pFi
10580 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
10590 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  k ){.      /* If
105a0 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
105b0 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
105c0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
105d0 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
105e0 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62  t.      ** yet b
105f0 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
10600 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
10610 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
10620 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
10630 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
10640 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  to pInode->pUnus
10650 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
10660 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
10670 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 20  ly closed .     
10680 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
10690 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
106a0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
106b0 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
106c0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
106d0 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
106e0 6f 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  o(pFile);.  }.  
106f0 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
10700 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65  le(id);.  unixLe
10710 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
10720 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
10730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
10740 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76  of the posix adv
10750 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65  isory lock imple
10760 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
10770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
10780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
107d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
10840 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
10850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
10870 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
10880 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
10890 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
108a0 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
108b0 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
108c0 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
108d0 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
108e0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
108f0 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
10900 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
10910 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
10920 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
10930 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
10940 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
10950 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
10960 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
10970 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
10980 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
10990 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
109a0 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
109b0 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
109c0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
109d0 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
109e0 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
109f0 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
10a00 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
10a10 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
10a20 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
10a30 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
10a40 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
10a50 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
10a60 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
10a70 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
10a80 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
10a90 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
10aa0 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
10ab0 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
10ac0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
10ad0 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
10ae0 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
10af0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
10b00 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
10b10 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
10b20 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
10b30 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
10b40 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
10b50 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  nt nolockCheckRe
10b60 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
10b70 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
10b80 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
10b90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10ba0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
10bb0 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
10bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10bd0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
10be0 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
10bf0 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
10c00 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
10c10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10c20 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
10c30 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
10c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
10c50 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
10c60 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
10c70 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
10c80 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
10c90 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
10ca0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
10cb0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
10cc0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10cd0 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   Close the file.
10ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
10cf0 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
10d00 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
10d10 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
10d20 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
10d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d40 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
10d50 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
10d60 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
10d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e30 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
10e40 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
10e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10e70 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
10e80 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
10e90 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
10ea0 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65   existence of se
10eb0 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
10ec0 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64  iles (really a d
10ed0 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e  irectory) to con
10ee0 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
10ef0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
10f00 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a  is works.** on j
10f10 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20  ust about every 
10f20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
10f30 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
10f40 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
10f50 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
10f60 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
10f70 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
10f80 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
10f90 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
10fa0 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
10fb0 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
10fc0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
10fd0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
10fe0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
10ff0 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
11000 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
11010 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
11020 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
11030 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
11040 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
11050 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
11060 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
11070 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
11080 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
11090 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
110a0 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
110b0 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
110c0 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
110d0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
110e0 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
110f0 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
11100 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f  ing a subdirecto
11110 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ry in the same d
11120 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74  irectory as.** t
11130 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
11140 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
11150 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e  me but with a ".
11160 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20  lock" extension 
11170 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78  added..** The ex
11180 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63  istence of a loc
11190 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c  k directory impl
111a0 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
111b0 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
111c0 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20  r.** lock types 
111d0 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
111e0 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
111f0 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
11200 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
11210 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
11220 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
11230 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
11240 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
11250 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
11260 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64  directory..*/.#d
11270 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55  efine DOTLOCK_SU
11280 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a  FFIX ".lock"../*
11290 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
112a0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
112b0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
112c0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
112d0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
112e0 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
112f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11300 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11310 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11320 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
11330 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
11340 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11350 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
11360 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
11370 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
11380 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
11390 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
113a0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
113b0 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  hecking..**.** I
113c0 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  n dotfile lockin
113d0 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b  g, either a lock
113e0 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f   exists or it do
113f0 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74  es not.  So in t
11400 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e  his.** variation
11410 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65   of CheckReserve
11420 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75  dLock(), *pResOu
11430 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
11440 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20   if any lock.** 
11450 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  is held on the f
11460 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ile and false if
11470 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
11480 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ocked..*/.static
11490 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
114a0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
114b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
114c0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
114d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
114e0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
114f0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
11500 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11510 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
11520 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
11530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
11540 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
11550 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
11560 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11570 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
11580 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
11590 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
115a0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
115b0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
115c0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
115d0 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
115e0 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
115f0 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  n or some other 
11600 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68  connection in th
11610 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20  e same process. 
11620 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f     ** holds a lo
11630 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ck on the file. 
11640 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   No need to chec
11650 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  k further. */.  
11660 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
11670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11680 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  The lock is held
11690 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
116a0 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69  the lockfile exi
116b0 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  sts */.    const
116c0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
116d0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
116e0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
116f0 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72  ntext;.    reser
11700 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a  ved = osAccess(z
11710 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b  LockFile, 0)==0;
11720 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
11730 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
11740 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
11750 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
11760 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
11770 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
11780 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
11790 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
117a0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
117b0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
117c0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
117d0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
117e0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
117f0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
11800 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
11810 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
11820 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
11830 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
11840 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
11850 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
11860 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
11870 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
11880 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
11890 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
118a0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
118b0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
118c0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
118d0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
118e0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
118f0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
11900 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
11910 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
11920 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
11930 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
11940 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
11950 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
11960 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
11970 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
11980 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
11990 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
119a0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
119b0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
119c0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
119d0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
119e0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
119f0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11a00 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
11a10 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
11a20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11a30 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
11a40 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
11a50 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
11a60 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
11a70 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
11a80 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
11a90 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
11aa0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
11ab0 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
11ac0 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
11ad0 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
11ae0 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
11af0 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
11b00 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
11b10 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
11b20 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
11b30 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
11b40 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
11b50 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11b60 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
11b70 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
11b80 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
11b90 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
11ba0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
11bb0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
11bc0 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
11bd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
11be0 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
11bf0 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
11c00 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
11c10 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
11c20 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
11c30 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
11c40 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
11c50 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
11c60 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
11c70 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11c80 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  k > NO_LOCK ){. 
11c90 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11ca0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11cb0 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
11cc0 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
11cd0 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
11ce0 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  ile */.#ifdef HA
11cf0 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69  VE_UTIME.    uti
11d00 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  me(zLockFile, NU
11d10 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  LL);.#else.    u
11d20 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
11d30 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
11d40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11d50 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11d60 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
11d70 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  ve lock */.  rc 
11d80 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46  = osMkdir(zLockF
11d90 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66  ile, 0777);.  if
11da0 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( rc<0 ){.    /*
11db0 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
11dc0 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20  create the lock 
11dd0 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
11de0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
11df0 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
11e00 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
11e10 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11e20 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
11e30 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
11e40 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11e50 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11e60 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
11e70 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
11e80 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
11e90 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
11ea0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11eb0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
11ec0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
11ed0 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20  n rc;.  } .  .  
11ee0 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
11ef0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
11f00 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
11f10 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
11f20 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
11f30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
11f40 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
11f50 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
11f60 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
11f70 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
11f80 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
11f90 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
11fa0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
11fb0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
11fc0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
11fd0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
11fe0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
11ff0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
12000 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
12010 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
12020 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
12030 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  -op..**.** When 
12040 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
12050 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43  l reaches NO_LOC
12060 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  K, delete the lo
12070 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ck file..*/.stat
12080 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
12090 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
120a0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
120b0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
120c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
120d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61  xFile*)id;.  cha
120e0 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
120f0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
12100 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
12110 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
12120 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
12130 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
12140 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
12150 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22  =%d (dotlock)\n"
12160 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
12170 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
12180 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12190 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
121a0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
121b0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
121c0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
121d0 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
121e0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
121f0 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
12200 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
12210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12220 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
12230 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
12240 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
12250 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
12260 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
12270 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
12280 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
12290 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
122a0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
122b0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
122c0 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
122d0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
122e0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
122f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12300 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
12310 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
12320 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
12330 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
12340 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
12350 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
12360 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28  .  rc = osRmdir(
12370 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66  zLockFile);.  if
12380 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
12390 3d 45 4e 4f 54 44 49 52 20 29 20 72 63 20 3d 20  =ENOTDIR ) rc = 
123a0 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69  osUnlink(zLockFi
123b0 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
123c0 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  ){.    int tErrn
123d0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
123e0 63 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 45  c = 0;.    if( E
123f0 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20  NOENT != tErrno 
12400 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
12410 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
12420 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
12430 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
12440 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
12450 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
12460 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
12470 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
12480 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
12490 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
124a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
124b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
124c0 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20  e a file.  Make 
124d0 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  sure the lock ha
124e0 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  s been released 
124f0 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a  before closing..
12500 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
12510 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  tlockClose(sqlit
12520 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
12530 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12540 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b  _OK;.  if( id ){
12550 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
12560 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12570 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63  *)id;.    dotloc
12580 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
12590 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OCK);.    sqlite
125a0 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
125b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
125c0 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
125d0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
125e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12600 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74  * End of the dot
12610 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  -file lock imple
12620 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
12630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
12640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
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 2a 0a 2a  **************.*
126e0 2a 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 20 42 65 67 69 6e 20  ********* Begin 
12700 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a  flock Locking **
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 0a 2a  **************.*
12730 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f  *.** Use the flo
12740 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ck() system call
12750 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b   to do file lock
12760 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  ing..**.** flock
12770 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  () locking is li
12780 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  ke dot-file lock
12790 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20  ing in that the 
127a0 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d  various.** fine-
127b0 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65  grain locking le
127c0 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62  vels supported b
127d0 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c  y SQLite are col
127e0 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  lapsed into.** a
127f0 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76   single exclusiv
12800 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65  e lock.  In othe
12810 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c  r words, SHARED,
12820 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a   RESERVED, and.*
12830 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20  * PENDING locks 
12840 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
12850 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49  ng as an EXCLUSI
12860 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65  VE lock.  SQLite
12870 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20  .** still works 
12880 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73  when you do this
12890 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63  , but concurrenc
128a0 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e  y is reduced sin
128b0 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  ce.** only a sin
128c0 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
128d0 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  be reading the d
128e0 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d  atabase at a tim
128f0 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68  e..**.** Omit th
12900 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51  is section if SQ
12910 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
12920 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72  ING_STYLE is tur
12930 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a  ned off or if.**
12940 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56   compiling for V
12950 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53  XWORKS..*/.#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 26 26 20 21 4f  KING_STYLE && !O
12980 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
12990 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63   Retry flock() c
129a0 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77  alls that fail w
129b0 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66  ith EINTR.*/.#if
129c0 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63  def EINTR.static
129d0 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63   int robust_floc
129e0 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  k(int fd, int op
129f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
12a00 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64  o{ rc = flock(fd
12a10 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  ,op); }while( rc
12a20 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
12a30 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
12a40 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  c;.}.#else.# def
12a50 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  ine robust_flock
12a60 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29  (a,b) flock(a,b)
12a70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f  .#endif.     ../
12a80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12a90 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
12aa0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
12ab0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
12ac0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
12ad0 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
12ae0 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
12af0 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
12b00 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
12b10 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
12b20 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
12b30 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
12b40 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
12b50 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
12b60 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
12b70 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
12b80 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
12b90 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
12ba0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
12bb0 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65  tic int flockChe
12bc0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
12bd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12be0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
12bf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12c00 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
12c10 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
12c20 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12c30 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
12c40 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12c50 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
12c60 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
12c70 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
12c80 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
12c90 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  );.  .  /* Check
12ca0 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
12cb0 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
12cc0 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
12cd0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
12ce0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
12cf0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
12d00 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
12d10 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
12d20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
12d30 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
12d40 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
12d50 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
12d60 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
12d70 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
12d80 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74  int lrc = robust
12d90 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
12da0 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
12db0 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72  NB);.    if( !lr
12dc0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f  c ){.      /* go
12dd0 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
12de0 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c  ck it */.      l
12df0 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
12e00 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
12e10 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28  _UN);.      if (
12e20 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20   lrc ) {.       
12e30 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
12e40 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rno;.        /* 
12e50 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69  unlock failed wi
12e60 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  th an error */. 
12e70 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c         lrc = SQL
12e80 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
12e90 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
12ea0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
12eb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
12ec0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12ed0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = 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 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12f00 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
12f10 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
12f20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
12f30 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
12f40 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
12f50 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
12f60 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
12f70 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
12f80 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
12f90 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
12fa0 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
12fb0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
12fc0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
12fd0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
12fe0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
12ff0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
13000 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
13010 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
13020 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
13030 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e   %d %d (flock)\n
13040 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
13050 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69   reserved));..#i
13060 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
13070 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13080 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
13090 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
130a0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
130b0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
130c0 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76  E_OK;.    reserv
130d0 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed=1;.  }.#endif
130e0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
130f0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
13100 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75  ORS */.  *pResOu
13110 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
13120 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13130 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
13140 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
13150 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
13160 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
13170 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
13180 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
13190 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
131a0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
131b0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
131c0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
131d0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
131e0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
131f0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
13200 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
13210 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
13220 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
13230 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
13240 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
13250 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
13260 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
13270 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
13280 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
13290 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
132a0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
132b0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
132c0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
132d0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
132e0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
132f0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
13300 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
13310 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
13320 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
13330 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
13340 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
13350 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
13360 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
13370 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
13380 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
13390 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
133a0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
133b0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
133c0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
133d0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
133e0 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f  .**.** flock() o
133f0 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
13400 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
13410 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
13420 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
13430 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
13440 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
13450 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
13460 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
13470 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
13480 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
13490 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
134a0 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
134b0 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
134c0 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
134d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
134e0 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
134f0 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
13500 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
13510 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
13520 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
13530 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
13540 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c  tatic int flockL
13550 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13560 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
13570 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
13580 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
13590 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
135a0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
135b0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
135c0 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20   );..  /* if we 
135d0 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
135e0 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
135f0 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
13600 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
13610 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
13620 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
13630 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13640 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
13650 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13660 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13670 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13680 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
13690 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
136a0 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20  ive lock */.  . 
136b0 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63   if (robust_floc
136c0 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
136d0 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20  _EX | LOCK_NB)) 
136e0 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  {.    int tErrno
136f0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a   = errno;.    /*
13700 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73   didn't get, mus
13710 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20  t be busy */.   
13720 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
13730 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
13740 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
13750 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
13760 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
13770 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
13780 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
13790 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
137a0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f    } else {.    /
137b0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
137c0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
137d0 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c  n ok */.    pFil
137e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
137f0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  FileLock;.  }.  
13800 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
13810 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63    %d %s %s (floc
13820 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
13830 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
13840 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20  eLock), .       
13850 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
13860 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
13870 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ed"));.#ifdef SQ
13880 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
13890 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
138a0 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
138b0 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
138c0 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
138d0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
138e0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
138f0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
13900 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
13910 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
13920 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  .../*.** Lower t
13930 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13940 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
13950 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
13960 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
13970 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
13980 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
13990 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
139a0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
139b0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
139c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
139d0 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
139e0 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
139f0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
13a00 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
13a10 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
13a20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13a30 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
13a40 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
13a50 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
13a60 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13a70 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
13a80 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
13a90 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
13aa0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
13ab0 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c  as %d pid=%d (fl
13ac0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
13ad0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
13ae0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
13af0 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
13b00 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
13b10 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
13b20 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
13b30 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
13b40 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
13b50 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
13b60 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
13b70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13b80 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
13b90 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
13ba0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
13bb0 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
13bc0 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
13bd0 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
13be0 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
13bf0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13c00 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
13c10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13c20 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
13c30 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
13c40 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f  ock. */.  if( ro
13c50 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
13c60 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b  ->h, LOCK_UN) ){
13c70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
13c80 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
13c90 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75  _ERRORS.    retu
13ca0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
13cb0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
13cc0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
13cd0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72  _ERRORS */.    r
13ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
13cf0 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c  RR_UNLOCK;.  }el
13d00 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  se{.    pFile->e
13d10 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
13d20 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
13d30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
13d40 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
13d50 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
13d60 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  nt flockClose(sq
13d70 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
13d80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13d90 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
13da0 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c   ){.    flockUnl
13db0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
13dc0 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65  ;.    rc = close
13dd0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
13de0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13df0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
13e00 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
13e10 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
13e20 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  XWORK */../*****
13e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
13e40 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20  nd of the flock 
13e50 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
13e60 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
13e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 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 2f 0a 0a 2f 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
13f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f30 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20  *** Begin Named 
13f40 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e  Semaphore Lockin
13f50 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
13f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
13f70 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
13f80 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
13f90 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78   supported on Vx
13fa0 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d  Works..**.** Sem
13fb0 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
13fc0 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20  s like dot-lock 
13fd0 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61  and flock in tha
13fe0 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  t it really only
13ff0 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43  .** supports EXC
14000 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20  LUSIVE locking. 
14010 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   Only a single p
14020 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20  rocess can read 
14030 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20  or write.** the 
14040 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
14050 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
14060 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c  educes potential
14070 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75   concurrency, bu
14080 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c  t.** makes the l
14090 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
140a0 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a  on much easier..
140b0 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
140c0 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  S../*.** This ro
140d0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
140e0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
140f0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
14100 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
14110 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
14120 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
14130 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
14140 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
14150 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
14160 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
14170 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
14180 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
14190 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
141a0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
141b0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
141c0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
141d0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
141e0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
141f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
14200 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
14210 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14220 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
14230 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
14240 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
14250 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
14260 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14270 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14280 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14290 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
142a0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
142b0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
142c0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
142d0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
142e0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
142f0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
14300 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
14310 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
14320 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
14330 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
14340 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
14350 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
14360 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
14370 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
14380 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
14390 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d  erved ){.    sem
143a0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
143b0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
143c0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
143d0 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66  statBuf;..    if
143e0 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
143f0 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
14400 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
14410 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
14420 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
14430 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14440 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14450 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14460 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
14470 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
14480 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  );.        pFile
14490 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
144a0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c  rrno;.      } el
144b0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  se {.        /* 
144c0 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73  someone else has
144d0 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77   the lock when w
144e0 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b  e are in NO_LOCK
144f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
14500 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65  rved = (pFile->e
14510 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45  FileLock < SHARE
14520 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
14530 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14540 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61    /* we could ha
14550 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
14560 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d   it */.      sem
14570 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20  _post(pSem);.   
14580 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
14590 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
145a0 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e  %d %d %d (sem)\n
145b0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
145c0 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
145d0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
145e0 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
145f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
14600 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
14610 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
14620 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
14630 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
14640 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
14650 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
14660 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
14670 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
14680 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
14690 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
146a0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
146b0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
146c0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
146d0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
146e0 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
146f0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
14700 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
14710 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
14720 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
14730 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
14740 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
14750 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
14760 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
14770 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
14780 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
14790 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
147a0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
147b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
147c0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
147d0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
147e0 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
147f0 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
14800 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
14810 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
14820 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
14830 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
14840 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
14850 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
14860 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
14870 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
14880 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
14890 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
148a0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65  CLUSIVE.**.** Se
148b0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e  maphore locks on
148c0 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
148d0 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
148e0 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
148f0 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
14900 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
14910 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
14920 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
14930 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
14940 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
14950 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
14960 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
14970 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
14980 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
14990 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
149a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
149b0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
149c0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
149d0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
149e0 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
149f0 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
14a00 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
14a10 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b  atic int semLock
14a20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14a30 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
14a40 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
14a50 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14a60 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b  e*)id;.  int fd;
14a70 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
14a80 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
14a90 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
14aa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
14ab0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
14ac0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
14ad0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
14ae0 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
14af0 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
14b00 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
14b10 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
14b20 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
14b30 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
14b40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14b50 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d  leLock;.    rc =
14b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14b70 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
14b80 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c  k;.  }.  .  /* l
14b90 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f  ock semaphore no
14ba0 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77  w but bail out w
14bb0 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b  hen already lock
14bc0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d  ed. */.  if( sem
14bd0 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d  _trywait(pSem)==
14be0 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  -1 ){.    rc = S
14bf0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
14c00 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
14c10 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74  k;.  }..  /* got
14c20 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
14c30 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
14c40 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  */.  pFile->eFil
14c50 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
14c60 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  k;.. sem_end_loc
14c70 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k:.  return rc;.
14c80 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
14c90 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
14ca0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
14cb0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
14cc0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
14cd0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
14ce0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
14cf0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
14d00 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
14d10 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
14d20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
14d30 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
14d40 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
14d50 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
14d60 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
14d70 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
14d80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
14d90 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
14da0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
14db0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
14dc0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14dd0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
14de0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
14df0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
14e00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
14e10 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
14e20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43  pSem );.  OSTRAC
14e30 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
14e40 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
14e50 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
14e60 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
14e70 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14e80 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
14e90 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
14ea0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
14eb0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
14ec0 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
14ed0 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
14ee0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
14ef0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
14f00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14f10 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
14f20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
14f30 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
14f40 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
14f50 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
14f60 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
14f70 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
14f80 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
14f90 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
14fa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14fb0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
14fc0 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c  * no, really unl
14fd0 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  ock. */.  if ( s
14fe0 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d  em_post(pSem)==-
14ff0 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
15000 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
15010 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
15020 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
15030 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
15040 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
15050 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
15060 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
15070 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
15080 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
15090 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
150a0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
150b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
150c0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
150d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
150e0 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
150f0 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
15100 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c  int semClose(sql
15110 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
15120 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
15130 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
15140 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
15150 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28  ;.    semUnlock(
15160 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
15170 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
15180 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
15190 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
151a0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
151b0 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  ile);.    unixLe
151c0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
151d0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
151e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
151f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
15200 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
15210 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
15220 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
15230 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
15240 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
15250 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
15260 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
15270 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
15280 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
15290 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
152a0 2a 2a 2a 2a 0a 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 2a  ****************
152c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152f0 2a 2a 2a 2f 0a 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15340 2a 2a 2a 2a 2a 2a 0a 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 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
15370 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
15380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15390 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
153a0 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
153b0 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
153c0 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
153d0 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
153e0 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
153f0 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
15400 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
15410 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
15420 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
15430 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
15440 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
15450 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
15460 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
15470 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
15480 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
15490 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
154a0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
154b0 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
154c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
154d0 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
154e0 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
154f0 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
15500 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
15510 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
15520 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
15530 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
15540 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
15550 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20   int reserved;. 
15560 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
15570 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
15580 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
15590 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
155a0 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
155b0 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
155c0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
155d0 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
155e0 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
155f0 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
15600 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
15610 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
15620 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
15630 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
15640 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
15650 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
15660 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
15670 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
15680 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
15690 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
156a0 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
156b0 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
156c0 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
156d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
156e0 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
156f0 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
15700 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
15710 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
15720 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15740 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
15750 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
15760 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
15770 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
15780 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
15790 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
157a0 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
157b0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
157c0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
157d0 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
157e0 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
157f0 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
15800 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
15810 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
15820 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
15830 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
15840 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
15850 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
15860 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
15870 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
15880 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
15890 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
158a0 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
158b0 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
158c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
158d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
158e0 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
158f0 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
15900 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
15910 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
15920 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
15930 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
15940 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
15950 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
15960 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15970 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
15980 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
15990 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
159a0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
159b0 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
159c0 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
159d0 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
159e0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
159f0 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
15a00 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
15a10 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
15a20 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
15a30 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
15a40 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
15a50 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
15a60 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
15a70 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
15a80 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50  .  OSTRACE(("AFP
15a90 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
15aa0 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
15ab0 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
15ac0 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
15ad0 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
15ae0 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
15af0 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
15b00 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
15b10 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20  length));.  err 
15b20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
15b30 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
15b40 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
15b50 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
15b60 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ) {.    int rc;.
15b70 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
15b80 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52   errno;.    OSTR
15b90 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
15ba0 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
15bb0 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
15bc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
15bd0 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72  ath, tErrno, str
15be0 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b  error(tErrno)));
15bf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
15c00 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
15c10 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53  RRORS.    rc = S
15c20 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73  QLITE_BUSY;.#els
15c30 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  e.    rc = sqlit
15c40 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
15c50 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20  rror(tErrno,.   
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53   setLockFlag ? S
15c80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
15c90 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   : SQLITE_IOERR_
15ca0 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20  UNLOCK);.#endif 
15cb0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
15cc0 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
15cd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c   */.    if( IS_L
15ce0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
15cf0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
15d00 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
15d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
15d20 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20  rn rc;.  } else 
15d30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15d40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
15d50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15d60 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
15d70 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
15d80 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
15d90 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
15da0 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
15db0 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
15dc0 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
15dd0 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
15de0 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
15df0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
15e00 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
15e10 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
15e20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15e30 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
15e40 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
15e50 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
15e60 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
15e70 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
15e80 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b  tic int afpCheck
15e90 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
15ea0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
15eb0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
15ec0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15ed0 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
15ee0 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
15ef0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
15f00 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
15f10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
15f20 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69  context;.  .  Si
15f30 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
15f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
15f50 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
15f60 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
15f70 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15f80 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c   context = (afpL
15f90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
15fa0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
15fb0 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f  ontext;.  if( co
15fc0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
15fd0 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
15fe0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
15ff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16000 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16010 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
16020 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
16030 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
16040 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
16050 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
16060 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
16070 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
16080 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
16090 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
160a0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
160b0 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
160c0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
160d0 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
160e0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
160f0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
16100 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
16110 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
16120 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
16130 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
16140 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
16150 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16160 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
16170 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
16180 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
16190 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
161a0 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
161b0 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
161c0 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
161d0 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
161e0 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
161f0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
16200 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
16210 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16220 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16230 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
16240 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
16250 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
16260 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
16270 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
16280 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
16290 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
162a0 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
162b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
162c0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
162d0 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
162e0 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
162f0 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
16300 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
16310 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
16320 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c   %d %d %d (afp)\
16330 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
16340 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
16350 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
16360 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
16370 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
16380 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
16390 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
163a0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
163b0 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
163c0 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
163d0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
163e0 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
163f0 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
16400 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
16410 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
16420 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
16430 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
16440 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
16450 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
16460 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
16470 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
16480 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
16490 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
164a0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
164b0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
164c0 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
164d0 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
164e0 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
164f0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
16500 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
16510 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
16520 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
16530 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
16540 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
16550 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
16560 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
16570 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
16580 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
16590 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
165a0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
165b0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
165c0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
165d0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
165e0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
165f0 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
16600 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
16610 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
16620 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
16630 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
16640 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
16650 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
16660 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
16670 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
16680 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
16690 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
166a0 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73  ic int afpLock(s
166b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
166c0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
166d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
166e0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
166f0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16700 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
16710 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
16720 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
16730 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
16740 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
16750 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
16760 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
16770 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
16780 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
16790 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
167a0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
167b0 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
167c0 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
167d0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
167e0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
167f0 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
16800 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
16810 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
16820 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
16830 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
16840 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
16850 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
16860 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
16870 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
16880 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
16890 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
168a0 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
168b0 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
168c0 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
168d0 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
168e0 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
168f0 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
16900 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
16910 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
16920 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16930 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
16940 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
16950 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
16960 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
16970 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  ld) (afp)\n", pF
16980 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
16990 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
169a0 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
169b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
169c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
169d0 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
169e0 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
169f0 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20  rrect.  **  (1) 
16a00 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
16a10 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
16a20 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
16a30 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
16a40 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
16a50 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
16a60 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
16a70 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
16a80 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
16a90 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
16aa0 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
16ab0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
16ac0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
16ad0 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
16ae0 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
16af0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16b00 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
16b10 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
16b20 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
16b30 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
16b40 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
16b50 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
16b60 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16b70 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
16b80 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
16b90 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
16ba0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
16bb0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
16bc0 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
16bd0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
16be0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
16bf0 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
16c00 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16c10 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
16c20 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
16c30 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
16c40 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
16c50 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
16c60 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
16c70 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
16c80 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
16c90 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
16ca0 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
16cb0 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
16cc0 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
16cd0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
16ce0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
16cf0 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20  .     ){.    rc 
16d00 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
16d10 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
16d20 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
16d30 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
16d40 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
16d50 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
16d60 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
16d70 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
16d80 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
16d90 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
16da0 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
16db0 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
16dc0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
16dd0 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
16de0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16df0 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
16e00 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
16e10 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16e20 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
16e30 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
16e40 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
16e50 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
16e60 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16e70 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
16e80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
16e90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
16ea0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
16eb0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
16ec0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
16ed0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
16ee0 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
16ef0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16f00 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  ++;.    goto afp
16f10 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
16f20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
16f30 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
16f40 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
16f50 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
16f60 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
16f70 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
16f80 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
16f90 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
16fa0 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
16fb0 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
16fc0 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
16fd0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16fe0 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
16ff0 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
17000 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
17010 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17020 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
17030 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
17040 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
17050 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17060 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17070 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
17080 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
17090 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
170a0 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
170b0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
170c0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
170d0 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
170e0 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
170f0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
17100 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
17110 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
17120 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
17130 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
17140 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
17150 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
17160 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
17170 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20  {.    int lrc1, 
17180 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20  lrc2, lrc1Errno 
17190 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  = 0;.    long lk
171a0 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
171b0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
171c0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
171d0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
171e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
171f0 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  );.        .    
17200 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c  mask = (sizeof(l
17210 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45  ong)==8) ? LARGE
17220 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66  ST_INT64 : 0x7ff
17230 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f  fffff;.    /* No
17240 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
17250 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock SHARED_LOCK 
17260 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
17270 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
17280 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
17290 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
172a0 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
172b0 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
172c0 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68   .    pInode->sh
172d0 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
172e0 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53   mask)%(SHARED_S
172f0 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
17300 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c1 = afpSetLock(
17310 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17320 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
17330 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
17340 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
17350 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
17360 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
17370 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
17380 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
17390 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
173a0 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
173b0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
173c0 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
173d0 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c    lrc2 = afpSetL
173e0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
173f0 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
17400 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
17410 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
17420 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
17430 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
17440 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
17450 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rc1Errno;.      
17460 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
17470 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
17480 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
17490 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
174a0 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
174b0 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
174c0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
174d0 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
174e0 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
174f0 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
17500 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
17510 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
17520 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
17530 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
17540 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
17550 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
17560 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
17570 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
17580 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
17590 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
175a0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
175b0 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
175c0 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
175d0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
175e0 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
175f0 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a   in this.     **
17600 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
17610 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
17620 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
17630 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17640 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
17650 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
17660 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
17670 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
17680 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
17690 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
176a0 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
176b0 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
176c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
176d0 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
176e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
176f0 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
17700 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
17710 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
17720 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63      if (eFileLoc
17730 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  k >= RESERVED_LO
17740 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
17750 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45  leLock < RESERVE
17760 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
17770 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
17780 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
17790 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
177a0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
177b0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
177c0 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
177d0 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69  E, 1,1);.      i
177e0 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20  f( !failed ){.  
177f0 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
17800 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
17810 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17820 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46  f (!failed && eF
17830 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55  ileLock == EXCLU
17840 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
17850 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
17860 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
17870 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
17880 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
17890 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
178a0 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
178b0 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
178c0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
178d0 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
178e0 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
178f0 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
17900 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
17910 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61  /.      if( !(fa
17920 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
17930 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17940 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
17950 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17970 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
17980 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
17990 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
179a0 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
179b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
179c0 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
179d0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
179e0 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
179f0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
17a00 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17a10 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17a20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
17a50 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
17a60 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
17a70 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
17a80 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17a90 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17aa0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
17ab0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
17ac0 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65  D_FIRST + pInode
17ad0 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
17ae0 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
17af0 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
17b00 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
17b10 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
17b20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
17b30 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
17b40 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
17b50 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
17b60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
17b70 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c  = ((failed & SQL
17b80 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
17b90 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
17ba0 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
17bb0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
17bc0 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
17bd0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
17be0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
17bf0 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
17c00 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
17c10 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
17c20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
17c30 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
17c40 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
17c50 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
17c60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17c70 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17c80 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
17c90 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
17ca0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
17cb0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
17cc0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
17cd0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
17ce0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17cf0 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
17d00 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
17d10 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
17d20 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
17d30 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
17d40 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
17d50 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
17d60 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70     %d %s %s (afp
17d70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
17d80 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
17d90 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
17da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
17db0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
17dc0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
17dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
17de0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17df0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
17e00 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
17e10 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
17e20 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
17e30 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
17e40 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
17e50 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
17e60 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
17e70 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17e80 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
17e90 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
17ea0 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
17eb0 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
17ec0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
17ed0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
17ee0 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
17ef0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
17f00 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
17f10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17f20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
17f30 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
17f40 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
17f50 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61  nfo *pInode;.  a
17f60 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
17f70 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
17f80 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17f90 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
17fa0 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73  Context;.  int s
17fb0 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23  kipShared = 0;.#
17fc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
17fd0 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c  T.  int h = pFil
17fe0 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  e->h;.#endif..  
17ff0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
18000 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
18010 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
18020 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
18030 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
18040 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
18050 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
18060 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
18070 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
18080 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
18090 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
180a0 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
180b0 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
180c0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
180d0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
180e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
180f0 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
18100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18110 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
18120 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
18130 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
18140 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
18150 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18160 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
18170 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
18180 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
18190 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
181a0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
181b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
181c0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
181d0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
181e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
181f0 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
18200 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18210 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
18220 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
18230 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
18240 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
18250 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
18260 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
18270 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
18280 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
18290 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
182a0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
182b0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
182c0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
182d0 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
182e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
182f0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
18300 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
18310 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
18320 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
18330 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
18340 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
18350 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
18360 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
18370 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
18380 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
18390 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
183a0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
183b0 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
183c0 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
183d0 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
183e0 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
183f0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
18400 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
18410 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
18420 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
18430 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
18440 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
18450 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
18460 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
18470 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
18480 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
18490 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
184a0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
184b0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
184c0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
184d0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
184e0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
184f0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
18500 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
18510 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
18520 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18530 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
18540 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
18550 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
18560 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
18570 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
18580 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
18590 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
185a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
185b0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
185c0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
185d0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
185e0 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
185f0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
18600 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
18610 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
18620 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
18630 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
18640 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
18650 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
18660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18670 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
18680 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
18690 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
186a0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
186b0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
186c0 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
186d0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
186e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
186f0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
18700 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
18710 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
18720 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
18730 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
18740 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
18750 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
18760 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
18770 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
18780 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
18790 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
187a0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
187b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
187c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
187d0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
187e0 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
187f0 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
18800 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
18810 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
18820 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
18830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18840 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
18850 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
18860 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
18870 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
18880 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
18890 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
188a0 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
188b0 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
188c0 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
188d0 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
188e0 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
188f0 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
18900 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
18910 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
18920 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
18930 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
18940 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
18950 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
18960 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
18970 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
18980 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
18990 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
189a0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
189b0 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
189c0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
189d0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
189e0 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
189f0 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
18a00 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18a10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18a20 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
18a30 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
18a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18a50 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
18a60 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
18a70 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
18a80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
18a90 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
18aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18ab0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
18ad0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
18ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18af0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
18b00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
18b10 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
18b20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e          closePen
18b30 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
18b40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18b50 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
18b60 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
18b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
18b80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18b90 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
18ba0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18bb0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
18bc0 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
18bd0 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
18be0 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
18bf0 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
18c00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
18c10 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
18c20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
18c30 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
18c40 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
18c50 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
18c60 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
18c70 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
18c80 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
18c90 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
18ca0 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
18cb0 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
18cc0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
18cd0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
18ce0 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
18cf0 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
18d00 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
18d10 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
18d20 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
18d30 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
18d40 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
18d50 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
18d60 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
18d70 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
18d80 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
18d90 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
18da0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
18db0 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
18dc0 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
18dd0 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
18de0 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
18df0 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
18e00 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
18e10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
18e20 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
18e30 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
18e40 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
18e50 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
18e60 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
18e70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
18e80 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
18e90 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
18ea0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
18eb0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
18ec0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
18ed0 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
18ee0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
18ef0 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
18f00 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
18f10 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
18f20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
18f30 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
18f40 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
18f50 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
18f60 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
18f70 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
18f80 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
18f90 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
18fa0 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
18fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fc0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
18fd0 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
18fe0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
18ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
19000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19010 2a 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 2f 0a  **************/.
19050 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
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 2a 2a 2a 2a 2a  ****************
19080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190a0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
190b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
190c0 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
190d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
190f0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
19100 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
19110 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
19120 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
19130 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
19140 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
19150 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
19160 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
19170 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73  FileLock. ** mus
19180 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
19190 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
191a0 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74  CK.. **. ** If t
191b0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
191c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
191d0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
191e0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20  dy at or below. 
191f0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
19200 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
19210 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
19220 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61  a no-op.. */.sta
19230 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63  tic int nfsUnloc
19240 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
19250 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
19260 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
19270 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
19280 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
19290 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
192a0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
192b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
192c0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
192d0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
192e0 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
192f0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
19300 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
19310 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
19320 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
19330 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
19340 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
19350 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
19360 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
19370 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
19380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
19390 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
193a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
193d0 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
19420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19460 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
19470 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
19480 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
19490 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
194a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
194c0 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
194d0 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
194e0 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
194f0 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
19500 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
19510 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
19520 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
19530 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
19540 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
19550 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
19560 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
19570 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
19580 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
19590 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
195a0 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
195b0 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
195c0 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
195d0 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
195e0 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
195f0 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
19600 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
19610 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
19620 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
19630 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
19640 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
19650 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
19660 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
19670 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
19680 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
19690 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
196a0 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
196b0 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
196c0 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
196d0 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
196e0 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
196f0 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
19700 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
19710 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
19720 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
19730 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
19740 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
19750 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
19760 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
19770 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
19780 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
19790 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
197a0 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
197b0 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  81..**.** To avo
197c0 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
197d0 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
197e0 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65   failed read the
197f0 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
19800 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
19810 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
19820 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
19830 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
19840 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
19850 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20  64 offset, void 
19860 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
19870 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e  .  int got;.  in
19880 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66  t prior = 0;.#if
19890 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
198a0 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
198b0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
198c0 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
198d0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
198e0 53 54 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28  START;.  assert(
198f0 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66   cnt==(cnt&0x1ff
19900 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
19910 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 63 6e   id->h>2 );.  cn
19920 74 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20  t &= 0x1ffff;.  
19930 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  do{.#if defined(
19940 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67  USE_PREAD).    g
19950 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d  ot = osPread(id-
19960 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
19970 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
19980 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
19990 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
199a0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
199b0 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  64).    got = os
199c0 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  Pread64(id->h, p
199d0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
199e0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
199f0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
19a00 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65   );.#else.    ne
19a10 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
19a20 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
19a30 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
19a40 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
19a50 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20  ewOffset-- );.  
19a60 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
19a70 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  =offset ){.     
19a80 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
19a90 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
19aa0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
19ab0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
19ac0 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  no;.      }else{
19ad0 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
19ae0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
19af0 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  rno = 0;.      }
19b00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
19b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20  ;.    }.    got 
19b20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20  = osRead(id->h, 
19b30 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
19b40 69 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d  if.    if( got==
19b50 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  cnt ) break;.   
19b60 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
19b70 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
19b80 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b  INTR ){ got = 1;
19b90 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20   continue; }.   
19ba0 20 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20     prior = 0;.  
19bb0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19bc0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
19bd0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 62 72   errno;.      br
19be0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
19bf0 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
19c00 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
19c10 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
19c20 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
19c30 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
19c40 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
19c50 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
19c60 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
19c70 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
19c80 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
19c90 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
19ca0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
19cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
19cc0 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
19cd0 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
19ce0 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
19cf0 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
19d00 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
19d10 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
19d20 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
19d30 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
19d40 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
19d50 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
19d60 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
19d70 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
19d80 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
19d90 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
19da0 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
19db0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19dc0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
19dd0 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
19de0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
19df0 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
19e00 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
19e10 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
19e20 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
19e30 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
19e40 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
19e50 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
19e60 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
19e70 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19e80 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
19e90 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
19ea0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
19eb0 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
19ec0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
19ed0 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
19ee0 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
19ef0 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
19f00 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
19f10 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
19f20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
19f30 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
19f40 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
19f50 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
19f60 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69    );.#endif..  i
19f70 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
19f80 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
19f90 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 69  EFERRED ){.    i
19fa0 6e 74 20 72 63 3b 0a 20 20 20 20 73 74 72 75 63  nt rc;.    struc
19fb0 74 20 73 74 61 74 20 73 42 75 66 3b 0a 20 20 20  t stat sBuf;.   
19fc0 20 6d 65 6d 73 65 74 28 26 73 42 75 66 2c 20 30   memset(&sBuf, 0
19fd0 2c 20 73 69 7a 65 6f 66 28 73 42 75 66 29 29 3b  , sizeof(sBuf));
19fe0 0a 20 20 20 20 72 63 20 3d 20 6f 73 53 74 61 74  .    rc = osStat
19ff0 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
1a000 73 42 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  sBuf);.    if( r
1a010 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  c!=0 ){.      me
1a020 6d 73 65 74 28 70 42 75 66 2c 20 30 2c 20 61 6d  mset(pBuf, 0, am
1a030 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  t);.      rc = (
1a040 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 3f 20  errno==ENOENT ? 
1a050 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1a060 52 54 5f 52 45 41 44 20 3a 20 53 51 4c 49 54 45  RT_READ : SQLITE
1a070 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20  _IOERR_FSTAT);. 
1a080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a090 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 28 70 46  rc = unixOpen(pF
1a0a0 69 6c 65 2d 3e 70 56 66 73 2c 20 70 46 69 6c 65  ile->pVfs, pFile
1a0b0 2d 3e 7a 50 61 74 68 2c 20 69 64 2c 20 70 46 69  ->zPath, id, pFi
1a0c0 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 20 30  le->openFlags, 0
1a0d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1a0e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a0f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1a100 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  c;.    }.  }.  a
1a110 73 73 65 72 74 28 20 28 70 46 69 6c 65 2d 3e 63  ssert( (pFile->c
1a120 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
1a130 49 4c 45 5f 44 45 46 45 52 52 45 44 29 3d 3d 30  ILE_DEFERRED)==0
1a140 20 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   );..#if SQLITE_
1a150 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1a160 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
1a170 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72  s much of this r
1a180 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70  ead request as p
1a190 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
1a1a0 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
1a1b0 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
1a1c0 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
1a1d0 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
1a1e0 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
1a1f0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1a200 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
1a210 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
1a220 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
1a230 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
1a240 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1a250 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61  ion))[offset], a
1a260 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
1a270 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1a280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1a290 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d  t nCopy = pFile-
1a2a0 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73  >mmapSize - offs
1a2b0 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  et;.      memcpy
1a2c0 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
1a2d0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1a2e0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f  n))[offset], nCo
1a2f0 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20  py);.      pBuf 
1a300 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b  = &((u8 *)pBuf)[
1a310 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d  nCopy];.      am
1a320 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t -= nCopy;.    
1a330 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70    offset += nCop
1a340 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  y;.    }.  }.#en
1a350 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65  dif..  got = see
1a360 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20  kAndRead(pFile, 
1a370 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
1a380 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61  t);.  if( got==a
1a390 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
1a3a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
1a3b0 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b  lse if( got<0 ){
1a3c0 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e  .    /* lastErrn
1a3d0 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
1a3e0 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75  Read */.    retu
1a3f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a400 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
1a410 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1a420 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20  rno = 0; /* not 
1a430 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1a440 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
1a450 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
1a460 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
1a470 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
1a480 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
1a490 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
1a4a0 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
1a4b0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a4c0 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
1a4d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1a4e0 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c   to seek the fil
1a4f0 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61 73  e-descriptor pas
1a500 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1a510 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20   argument to.** 
1a520 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20  absolute offset 
1a530 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d  iOff, then attem
1a540 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66  pt to write nBuf
1a550 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
1a560 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69  rom.** pBuf to i
1a570 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
1a580 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31  ccurs, return -1
1a590 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e   and set *piErrn
1a5a0 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  o. Otherwise, .*
1a5b0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63 74  * return the act
1a5c0 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ual number of by
1a5d0 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68 69  tes written (whi
1a5e0 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74  ch may be less t
1a5f0 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f  han.** nBuf)..*/
1a600 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1a610 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e  AndWriteFd(.  in
1a620 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20  t fd,           
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a640 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1a650 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1a660 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20    i64 iOff,     
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74    /* File offset
1a690 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
1a6a0 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  g at */.  const 
1a6b0 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
1a6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
1a6d0 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  y data from this
1a6e0 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20 66   buffer to the f
1a6f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75  ile */.  int nBu
1a700 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1a710 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1a720 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66 20   of buffer pBuf 
1a730 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
1a740 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20  t *piErrno      
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a760 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62   OUT: Error numb
1a770 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75  er if error occu
1a780 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  rs */.){.  int r
1a790 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1a7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1a7b0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a7c0 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a  system call */..
1a7d0 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d    assert( nBuf==
1a7e0 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20 29  (nBuf&0x1ffff) )
1a7f0 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 32  ;.  assert( fd>2
1a800 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78   );.  nBuf &= 0x
1a810 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53  1ffff;.  TIMER_S
1a820 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e  TART;..#if defin
1a830 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
1a840 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72 69 74  do{ rc = osPwrit
1a850 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1a860 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28  , iOff); }while(
1a870 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1a880 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64  EINTR );.#elif d
1a890 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1a8a0 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f  64).  do{ rc = o
1a8b0 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42  sPwrite64(fd, pB
1a8c0 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1a8d0 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1a8e0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23  errno==EINTR);.#
1a8f0 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69  else.  do{.    i
1a900 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b  64 iSeek = lseek
1a910 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f  (fd, iOff, SEEK_
1a920 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
1a930 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b  teIOError( iSeek
1a940 2d 2d 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  -- );..    if( i
1a950 53 65 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20 20  Seek!=iOff ){.  
1a960 20 20 20 20 69 66 28 20 70 69 45 72 72 6e 6f 20      if( piErrno 
1a970 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69 53  ) *piErrno = (iS
1a980 65 65 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f 20  eek==-1 ? errno 
1a990 3a 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  : 0);.      retu
1a9a0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1a9b0 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
1a9c0 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , pBuf, nBuf);. 
1a9d0 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1a9e0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1a9f0 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52  .#endif..  TIMER
1aa00 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1aa10 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
1aa20 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1aa30 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20  , fd, rc, iOff, 
1aa40 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
1aa50 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20  ..  if( rc<0 && 
1aa60 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72  piErrno ) *piErr
1aa70 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65  no = errno;.  re
1aa80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1aa90 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
1aaa0 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
1aab0 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
1aac0 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
1aad0 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
1aae0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1aaf0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
1ab00 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
1ab10 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
1ab20 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
1ab30 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
1ab40 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
1ab50 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
1ab60 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
1ab70 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1ab80 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1ab90 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
1aba0 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
1abb0 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
1abc0 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
1abd0 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57   return seekAndW
1abe0 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66  riteFd(id->h, of
1abf0 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c  fset, pBuf, cnt,
1ac00 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29   &id->lastErrno)
1ac10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
1ac20 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
1ac30 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
1ac40 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1ac50 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
1ac60 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
1ac70 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
1ac80 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1ac90 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
1aca0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1acb0 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
1acc0 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1acd0 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1ace0 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
1acf0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1ad00 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1ad10 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  d;.  int wrote =
1ad20 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
1ad30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1ad40 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1ad50 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1ad60 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1ad70 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1ad80 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1ad90 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1ada0 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1adb0 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1adc0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1add0 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1ade0 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1adf0 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
1ae00 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1ae10 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1ae20 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1ae30 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1ae40 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1ae50 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1ae60 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20  E_DEBUG.  /* If 
1ae70 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
1ae80 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
1ae90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1aea0 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
1aeb0 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1aec0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1aed0 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1aee0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1aef0 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
1af00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1af10 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
1af20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
1af30 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
1af40 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
1af50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1af60 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
1af70 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
1af80 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
1af90 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
1afa0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
1afb0 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
1afc0 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
1afd0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1afe0 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
1aff0 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
1b000 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
1b010 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
1b020 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
1b030 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
1b040 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b050 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1b060 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
1b070 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
1b080 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
1b090 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b0a0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1b0b0 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
1b0c0 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
1b0d0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
1b0e0 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
1b0f0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1b100 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1b110 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
1b120 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1b130 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
1b140 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b150 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1b160 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1b170 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1b180 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1b190 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
1b1a0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1b1b0 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1b1c0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1b1d0 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1b1e0 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1b1f0 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1b200 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1b210 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1b220 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1b230 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1b240 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1b250 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1b260 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1b270 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
1b280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b290 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b2a0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1b2b0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1b2c0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1b2d0 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1b2e0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1b2f0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1b300 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1b310 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1b320 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1b330 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1b340 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1b350 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1b360 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c  }.#endif..  whil
1b370 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f  e( amt>0 && (wro
1b380 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1b390 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1b3a0 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
1b3b0 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
1b3c0 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b  te;.    offset +
1b3d0 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
1b3e0 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
1b3f0 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
1b400 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b410 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
1b420 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
1b430 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1b440 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
1b450 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74  1 ));..  if( amt
1b460 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  >0 ){.    if( wr
1b470 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e  ote<0 && pFile->
1b480 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50  lastErrno!=ENOSP
1b490 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  C ){.      /* la
1b4a0 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1b4b0 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1b4c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b4d0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1b4e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b4f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1b500 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20  o = 0; /* not a 
1b510 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1b520 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b530 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1b540 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1b550 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
1b560 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
1b570 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1b580 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
1b590 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
1b5a0 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
1b5b0 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
1b5c0 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
1b5d0 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
1b5e0 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
1b5f0 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
1b600 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1b610 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
1b620 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
1b630 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
1b640 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20  /*.** We do not 
1b650 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f  trust systems to
1b660 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69   provide a worki
1b670 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20  ng fdatasync(). 
1b680 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68   Some do..** Oth
1b690 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62  ers do no.  To b
1b6a0 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20  e safe, we will 
1b6b0 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28  stick with the (
1b6c0 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29  slightly slower)
1b6d0 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20  .** fsync(). If 
1b6e0 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f  you know that yo
1b6f0 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  ur system does s
1b700 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63  upport fdatasync
1b710 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a  () correctly,.**
1b720 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d   then simply com
1b730 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74  pile with -Dfdat
1b740 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a  async=fdatasync.
1b750 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1b760 66 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66  fdatasync).# def
1b770 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73  ine fdatasync fs
1b780 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ync.#endif../*.*
1b790 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55  * Define HAVE_FU
1b7a0 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20  LLFSYNC to 0 or 
1b7b0 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  1 depending on w
1b7c0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
1b7d0 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   the F_FULLFSYNC
1b7e0 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
1b7f0 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  d.  F_FULLFSYNC 
1b800 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
1b810 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
1b820 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74  n Mac OS X.  But
1b830 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e   that could chan
1b840 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f  ge..*/.#ifdef F_
1b850 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69  FULLFSYNC.# defi
1b860 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1b870 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  C 1.#else.# defi
1b880 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1b890 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  C 0.#endif.../*.
1b8a0 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73  ** The fsync() s
1b8b0 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20  ystem call does 
1b8c0 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65  not work as adve
1b8d0 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a  rtised on many.*
1b8e0 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20  * unix systems. 
1b8f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
1b900 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61  rocedure is an a
1b910 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a  ttempt to make.*
1b920 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72  * it work better
1b930 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1b940 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f  TE_NO_SYNC macro
1b950 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73   disables all fs
1b960 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73  ync()s.  This is
1b970 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74   useful.** for t
1b980 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77  esting when we w
1b990 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75  ant to run throu
1b9a0 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74  gh the test suit
1b9b0 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f  e quickly..** Yo
1b9c0 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61  u are strongly a
1b9d0 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20  dvised *not* to 
1b9e0 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49  deploy with SQLI
1b9f0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e  TE_NO_SYNC.** en
1ba00 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20  abled, however, 
1ba10 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54  since with SQLIT
1ba20 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65  E_NO_SYNC enable
1ba30 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a  d, an OS crash.*
1ba40 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
1ba50 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63  re will likely c
1ba60 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62  orrupt the datab
1ba70 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1ba80 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20  SQLite sets the 
1ba90 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66  dataOnly flag if
1baa0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1bab0 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67   file is unchang
1bac0 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20  ed..** The idea 
1bad0 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20  behind dataOnly 
1bae0 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  is that it shoul
1baf0 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65  d only write the
1bb00 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a   file content.**
1bb10 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68   to disk, not th
1bb20 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c  e inode.  We onl
1bb30 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69  y set dataOnly i
1bb40 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  f the file size 
1bb50 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  is .** unchanged
1bb60 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20   since the file 
1bb70 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20  size is part of 
1bb80 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65  the inode.  Howe
1bb90 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27  ver, .** Ted Ts'
1bba0 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20  o tells us that 
1bbb0 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
1bbc0 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20   also write the 
1bbd0 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20  inode if the.** 
1bbe0 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68  file size has ch
1bbf0 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79  anged.  The only
1bc00 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65   real difference
1bc10 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79   between fdatasy
1bc20 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e  nc().** and fsyn
1bc30 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75  c(), Ted tells u
1bc40 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61  s, is that fdata
1bc50 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20  sync() will not 
1bc60 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f  flush the.** ino
1bc70 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20  de if the mtime 
1bc80 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65  or owner or othe
1bc90 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74  r inode attribut
1bca0 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e  es have changed.
1bcb0 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65  .** We only care
1bcc0 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
1bcd0 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74  size, not the ot
1bce0 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75  her file attribu
1bcf0 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61  tes, so.** as fa
1bd00 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63  r as SQLite is c
1bd10 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61  oncerned, an fda
1bd20 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61  tasync() is alwa
1bd30 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20  ys adequate..** 
1bd40 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  So, we always us
1bd50 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66  e fdatasync() if
1bd60 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
1bd70 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a  , regardless of.
1bd80 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1bd90 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
1bda0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1bdb0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20   full_fsync(int 
1bdc0 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  fd, int fullSync
1bdd0 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
1bde0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1bdf0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22   The following "
1be00 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f  ifdef/elif/else/
1be10 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20  " block has the 
1be20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61  same structure a
1be30 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62  s.  ** the one b
1be40 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c  elow. It is repl
1be50 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65  icated here sole
1be60 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74  ly to avoid clut
1be70 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20  tering .  ** up 
1be80 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69  the real code wi
1be90 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41  th the UNUSED_PA
1bea0 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73  RAMETER() macros
1beb0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1bec0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55  LITE_NO_SYNC.  U
1bed0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1bee0 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
1bef0 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
1bf00 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1bf10 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1bf20 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
1bf30 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  FSYNC.  UNUSED_P
1bf40 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1bf50 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  y);.#else.  UNUS
1bf60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
1bf70 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
1bf80 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1bf90 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nly);.#endif..  
1bfa0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75  /* Record the nu
1bfb0 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
1bfc0 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61  at we do a norma
1bfd0 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20  l fsync() and . 
1bfe0 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54   ** FULLSYNC.  T
1bff0 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69  his is used duri
1c000 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65  ng testing to ve
1c010 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70  rify that this p
1c020 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65  rocedure.  ** ge
1c030 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  ts called with t
1c040 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d  he correct argum
1c050 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ents..  */.#ifde
1c060 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1c070 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73  if( fullSync ) s
1c080 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
1c090 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74  count++;.  sqlit
1c0a0 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
1c0b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1c0c0 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
1c0d0 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
1c0e0 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
1c0f0 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
1c100 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
1c110 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1c120 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  NC.  rc = SQLITE
1c130 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  _OK;.#elif HAVE_
1c140 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20  FULLFSYNC.  if( 
1c150 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
1c160 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c  rc = osFcntl(fd,
1c170 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
1c180 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1c190 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
1c1a0 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
1c1b0 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
1c1c0 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
1c1d0 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a   an fsync()..  *
1c1e0 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
1c1f0 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
1c200 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
1c210 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
1c220 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20   ** file system 
1c230 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
1c240 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
1c250 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
1c260 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74  ** isn't support
1c270 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
1c280 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
1c290 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
1c2a0 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77   ** and (for now
1c2b0 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
1c2c0 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
1c2d0 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
1c2e0 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62  l.  .  ** It'd b
1c2f0 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
1c300 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
1c310 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
1c320 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63  oid .  ** the fc
1c330 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
1c340 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
1c350 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ed..  */.  if( r
1c360 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66  c ) rc = fsync(f
1c370 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e  d);..#elif defin
1c380 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1c390 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f  /* fdatasync() o
1c3a0 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79  n HFS+ doesn't y
1c3b0 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c  et flush the fil
1c3c0 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61  e size if it cha
1c3d0 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  nged correctly. 
1c3e0 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79   ** so currently
1c3f0 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74   we default to t
1c400 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65  he macro that re
1c410 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e  defines fdatasyn
1c420 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a  c to fsync.  */.
1c430 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1c440 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20  ;.#else .  rc = 
1c450 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23  fdatasync(fd);.#
1c460 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1c470 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72  if( rc==-1 && er
1c480 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a  rno==ENOTSUP ){.
1c490 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
1c4a0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
1c4b0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1c4c0 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
1c4d0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1c4e0 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1c4f0 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f  NC */..  if( OS_
1c500 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20  VXWORKS && rc!= 
1c510 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  -1 ){.    rc = 0
1c520 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c530 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
1c540 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
1c550 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
1c560 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
1c570 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
1c580 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1c590 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1c5a0 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
1c5b0 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
1c5c0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1c5d0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
1c5e0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
1c5f0 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
1c600 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
1c610 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
1c620 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
1c630 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
1c640 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
1c650 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  ** The directory
1c660 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c670 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c   is used for onl
1c680 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f  y one thing - to
1c690 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69  .** fsync() a di
1c6a0 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20  rectory to make 
1c6b0 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69  sure file creati
1c6c0 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20  on and deletion 
1c6d0 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c  events.** are fl
1c6e0 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ushed to disk.  
1c6f0 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20  Such fsyncs are 
1c700 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65  not needed on ne
1c710 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e  wer.** journalin
1c720 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62  g filesystems, b
1c730 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ut are required 
1c740 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73  on older filesys
1c750 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tems..**.** This
1c760 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1c770 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67  overridden using
1c780 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c   the xSetSysCall
1c790 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54   interface..** T
1c7a0 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76  he ability to ov
1c7b0 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74  erride this rout
1c7c0 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e  ine was added in
1c7d0 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a   support of the.
1c7e0 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  ** chromium sand
1c7f0 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20  box.  Opening a 
1c800 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73  directory is a s
1c810 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65  ecurity risk (we
1c820 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f   are.** told) so
1c830 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72   making it overr
1c840 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74  ideable allows t
1c850 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  he chromium sand
1c860 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63  box to.** replac
1c870 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1c880 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e  ith a harmless n
1c890 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74  o-op.  To make t
1c8a0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
1c8b0 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20   no-op, replace 
1c8c0 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74  it with a stub t
1c8d0 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49  hat returns SQLI
1c8e0 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73  TE_OK but leaves
1c8f0 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20  .** *pFd set to 
1c900 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1c910 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  r..**.** If SQLI
1c920 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1c930 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  d, the caller is
1c940 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1c950 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20   closing.** the 
1c960 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1c970 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65  *pFd using close
1c980 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1c990 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
1c9a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1c9b0 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29  ename, int *pFd)
1c9c0 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
1c9d0 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61  t fd = -1;.  cha
1c9e0 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50  r zDirname[MAX_P
1c9f0 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73  ATHNAME+1];..  s
1ca00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1ca10 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44  MAX_PATHNAME, zD
1ca20 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46  irname, "%s", zF
1ca30 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ilename);.  for(
1ca40 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  ii=(int)strlen(z
1ca50 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26  Dirname); ii>1 &
1ca60 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d  & zDirname[ii]!=
1ca70 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66  '/'; ii--);.  if
1ca80 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44  ( ii>0 ){.    zD
1ca90 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30  irname[ii] = '\0
1caa0 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ';.    fd = robu
1cab0 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65  st_open(zDirname
1cac0 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
1cad0 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ARY, 0);.    if(
1cae0 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
1caf0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49  OSTRACE(("OPENDI
1cb00 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
1cb10 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20  , zDirname));.  
1cb20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d    }.  }.  *pFd =
1cb30 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
1cb40 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75  d>=0?SQLITE_OK:u
1cb50 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1cb60 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1cb70 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61  , "open", zDirna
1cb80 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  me));.}../*.** M
1cb90 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
1cba0 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
1cbb0 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
1cbc0 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
1cbd0 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
1cbe0 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
1cbf0 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
1cc00 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
1cc10 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
1cc20 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
1cc30 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
1cc40 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
1cc50 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
1cc60 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
1cc70 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
1cc80 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
1cc90 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
1cca0 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1ccb0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
1ccc0 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
1ccd0 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
1cce0 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1ccf0 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
1cd00 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
1cd10 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
1cd20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
1cd30 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
1cd40 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
1cd50 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1cd60 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
1cd70 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
1cd80 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
1cd90 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
1cda0 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
1cdb0 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
1cdc0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1cdd0 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1cde0 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1cdf0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1ce00 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
1ce10 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
1ce20 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
1ce30 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
1ce40 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
1ce50 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1ce60 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
1ce70 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
1ce80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1ce90 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
1cea0 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
1ceb0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1cec0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
1ced0 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
1cee0 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
1cef0 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
1cf00 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
1cf10 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1cf20 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
1cf30 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1cf40 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
1cf50 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
1cf60 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
1cf70 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
1cf80 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1cf90 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
1cfa0 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
1cfb0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1cfc0 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
1cfd0 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
1cfe0 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
1cff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1d000 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
1d010 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
1d020 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
1d030 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
1d040 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
1d050 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1d060 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1d070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1d080 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
1d090 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1d0a0 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE(("SYNC    %-
1d0b0 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
1d0c0 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
1d0d0 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
1d0e0 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
1d0f0 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
1d100 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1d110 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1d120 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1d130 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1d140 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1d150 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1d160 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1d170 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1d180 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ath);.  }..  /* 
1d190 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64  Also fsync the d
1d1a0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1d1b0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20  ing the file if 
1d1c0 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67  the DIRSYNC flag
1d1d0 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54  .  ** is set.  T
1d1e0 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d  his is a one-tim
1d1f0 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d  e occurrence.  M
1d200 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61  any systems (exa
1d210 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a  mples: AIX).  **
1d220 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66   are unable to f
1d230 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79  sync a directory
1d240 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f  , so ignore erro
1d250 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e  rs on the fsync.
1d260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1d270 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1d280 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
1d290 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64  ){.    int dirfd
1d2a0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
1d2b0 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65  DIRSYNC %s (have
1d2c0 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
1d2d0 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
1d2e0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20  File->zPath,.   
1d2f0 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
1d300 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
1d310 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync));.    rc = 
1d320 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
1d330 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64  pFile->zPath, &d
1d340 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
1d350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d360 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
1d370 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72    full_fsync(dir
1d380 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
1d390 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1d3a0 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49  ile, dirfd, __LI
1d3b0 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
1d3c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d3d0 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
1d3e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d3f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1d400 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1d410 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e  ~UNIXFILE_DIRSYN
1d420 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
1d430 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
1d440 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
1d450 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
1d460 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
1d470 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1d480 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1d490 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
1d4a0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1d4b0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1d4c0 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  id;.  int rc;.  
1d4d0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1d4e0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1d4f0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1d500 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1d510 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1d520 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
1d530 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
1d540 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
1d550 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1d560 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
1d570 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
1d580 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
1d590 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
1d5a0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
1d5b0 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
1d5c0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
1d5d0 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
1d5e0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
1d5f0 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
1d600 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
1d610 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
1d620 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
1d630 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1d640 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
1d650 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1d660 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63  Chunk;.  }..  rc
1d670 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63   = robust_ftrunc
1d680 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f  ate(pFile->h, (o
1d690 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69  ff_t)nByte);.  i
1d6a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
1d6b0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1d6c0 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1d6d0 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1d6e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1d6f0 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1d700 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1d710 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
1d720 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d730 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1d740 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
1d750 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
1d760 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
1d770 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  sed to.    ** do
1d780 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1d790 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1d7a0 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1d7b0 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1d7c0 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61      ** normal da
1d7d0 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64  tabase file) and
1d7e0 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65   we truncate the
1d7f0 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1d800 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61  ngth,.    ** tha
1d810 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70  t effectively up
1d820 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1d830 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
1d840 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20  might happen.   
1d850 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69   ** when restori
1d860 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73  ng a database us
1d870 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41  ing the backup A
1d880 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c  PI from a zero-l
1d890 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75  ength.    ** sou
1d8a0 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rce..    */.    
1d8b0 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1d8c0 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74  malWrite && nByt
1d8d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  e==0 ){.      pF
1d8e0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1d8f0 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  ng = 1;.    }.#e
1d900 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1d910 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1d920 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
1d930 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72 75  ile was just tru
1d940 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65  ncated to a size
1d950 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1d960 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
1d970 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
1d980 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
1d990 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
1d9a0 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
1d9b0 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ite will.    ** 
1d9c0 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77  use read() and w
1d9d0 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73  rite() to access
1d9e0 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69   data beyond thi
1d9f0 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77  s point from now
1da00 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20   on.  .    */.  
1da10 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c    if( nByte<pFil
1da20 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1da30 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1da40 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Size = nByte;.  
1da50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1da60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1da70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1da80 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
1da90 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
1daa0 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
1dab0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1dac0 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1dad0 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  file *id, i64 *p
1dae0 53 69 7a 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c  Size){.  unixFil
1daf0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1db00 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
1db10 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  rc;.  struct sta
1db20 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28  t buf;.  assert(
1db30 20 69 64 20 29 3b 0a 20 20 69 66 28 20 70 46 69   id );.  if( pFi
1db40 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1db50 55 4e 49 58 46 49 4c 45 5f 44 45 46 45 52 52 45  UNIXFILE_DEFERRE
1db60 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  D ){.    rc = os
1db70 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74  Stat(pFile->zPat
1db80 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 69 66  h, &buf);.    if
1db90 28 20 72 63 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ( rc && errno==E
1dba0 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72  NOENT ){.      r
1dbb0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 75 66  c = 0;.      buf
1dbc0 2e 73 74 5f 73 69 7a 65 20 3d 20 30 3b 0a 20 20  .st_size = 0;.  
1dbd0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1dbe0 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46   rc = osFstat(pF
1dbf0 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20  ile->h, &buf);. 
1dc00 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
1dc10 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1dc20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1dc30 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1dc40 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1dc50 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1dc60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1dc70 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  AT;.  }.  *pSize
1dc80 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
1dc90 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69  .  /* When openi
1dca0 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64  ng a zero-size d
1dcb0 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e  atabase, the fin
1dcc0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f  dInodeInfo() pro
1dcd0 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74  cedure.  ** writ
1dce0 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  es a single byte
1dcf0 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20   into that file 
1dd00 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
1dd10 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20   around a bug.  
1dd20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d  ** in the OS-X m
1dd30 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e  sdos filesystem.
1dd40 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76    In order to av
1dd50 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  oid problems wit
1dd60 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79  h upper.  ** lay
1dd70 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ers, we need to 
1dd80 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65  report this file
1dd90 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76   size as zero ev
1dda0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a  en though it is.
1ddb0 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20    ** really 1.  
1ddc0 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20   Ticket #3260.. 
1ddd0 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65   */.  if( *pSize
1dde0 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30  ==1 ) *pSize = 0
1ddf0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
1de00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1de10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1de20 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1de30 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1de40 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1de50 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1de60 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1de70 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1de80 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1de90 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1dea0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1deb0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1dec0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1ded0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1dee0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1def0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1df00 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1df10 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1df20 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1df30 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1df40 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1df50 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1df60 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1df70 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1df80 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1df90 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1dfa0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1dfb0 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1dfc0 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1dfd0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1dfe0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1dff0 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1e000 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1e010 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1e020 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1e030 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1e040 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1e050 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1e060 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1e070 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1e080 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1e090 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1e0a0 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1e0b0 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1e0c0 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1e0d0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1e0e0 66 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  f) ) return SQLI
1e0f0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1e100 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e  .    nSize = ((n
1e110 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68  Byte+pFile->szCh
1e120 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e  unk-1) / pFile->
1e130 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
1e140 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69  ->szChunk;.    i
1e150 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75  f( nSize>(i64)bu
1e160 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69  f.st_size ){..#i
1e170 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
1e180 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
1e190 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
1e1a0 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a  LLOCATE.      /*
1e1b0 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20   The code below 
1e1c0 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20  is handling the 
1e1d0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
1e1e0 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20  osFallocate() . 
1e1f0 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c       ** correctl
1e200 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  y. posix_falloca
1e210 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  te() is defined 
1e220 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f  to "returns zero
1e230 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20   on success, .  
1e240 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72      ** or an err
1e250 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61  or number on  fa
1e260 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20  ilure". See the 
1e270 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61  manpage for deta
1e280 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ils. */.      in
1e290 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b  t err;.      do{
1e2a0 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f  .        err = o
1e2b0 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65  sFallocate(pFile
1e2c0 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65  ->h, buf.st_size
1e2d0 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73  , nSize-buf.st_s
1e2e0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ize);.      }whi
1e2f0 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29  le( err==EINTR )
1e300 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20  ;.      if( err 
1e310 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1e320 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c  IOERR_WRITE;.#el
1e330 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  se.      /* If t
1e340 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68  he OS does not h
1e350 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ave posix_falloc
1e360 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20  ate(), fake it. 
1e370 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20 20  First use.      
1e380 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  ** ftruncate() t
1e390 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20 73  o set the file s
1e3a0 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  ize, then write 
1e3b0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
1e3c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  .      ** the la
1e3d0 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20  st byte in each 
1e3e0 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65  block within the
1e3f0 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e   extended region
1e400 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
1e410 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63 68  is the same tech
1e420 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67 6c  nique used by gl
1e430 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ibc to implement
1e440 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1e450 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73  ().      ** on s
1e460 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e  ystems that do n
1e470 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66  ot have a real f
1e480 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65  allocate() syste
1e490 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  m call..      */
1e4a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20  .      int nBlk 
1e4b0 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65  = buf.st_blksize
1e4c0 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65  ;  /* File-syste
1e4d0 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a  m block size */.
1e4e0 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65        i64 iWrite
1e4f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e500 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74    /* Next offset
1e510 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1e520 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73  .      if( robus
1e530 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1e540 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a  e->h, nSize) ){.
1e550 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
1e560 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1e570 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e580 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1e590 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1e5a0 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1e5b0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1e5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e5d0 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73 74  Write = ((buf.st
1e5e0 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d  _size + 2*nBlk -
1e5f0 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31   1)/nBlk)*nBlk-1
1e600 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  ;.      while( i
1e610 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a 20  Write<nSize ){. 
1e620 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74         int nWrit
1e630 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1e640 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20  (pFile, iWrite, 
1e650 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  "", 1);.        
1e660 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20  if( nWrite!=1 ) 
1e670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e680 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  ERR_WRITE;.     
1e690 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c     iWrite += nBl
1e6a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
1e6b0 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  f.    }.  }..#if
1e6c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1e6d0 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
1e6e0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1e6f0 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c  >0 && nByte>pFil
1e700 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1e710 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
1e720 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1e730 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  k<=0 ){.      if
1e740 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
1e750 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  te(pFile->h, nBy
1e760 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  te) ){.        p
1e770 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1e780 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
1e790 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1e7a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1e7b0 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72  R_TRUNCATE, "ftr
1e7c0 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e  uncate", pFile->
1e7d0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
1e7e0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
1e7f0 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c  unixMapfile(pFil
1e800 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72  e, nByte);.    r
1e810 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
1e820 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53  ndif..  return S
1e830 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1e840 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
1e850 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61 74  nititially negat
1e860 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
1e870 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
1e880 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
1e890 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
1e8a0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
1e8b0 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
1e8c0 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
1e8d0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
1e8e0 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
1e8f0 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
1e900 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
1e910 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
1e920 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e930 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78  unixModeBit(unix
1e940 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
1e950 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
1e960 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
1e970 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
1e980 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
1e990 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
1e9a0 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
1e9b0 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
1e9c0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1e9d0 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
1e9e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1e9f0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1ea00 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
1ea10 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1ea20 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
1ea30 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
1ea40 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
1ea50 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a  ar *zBuf);../*.*
1ea60 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
1ea70 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
1ea80 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
1ea90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1eaa0 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
1eab0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1eac0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1ead0 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c  pArg){.  unixFil
1eae0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1eaf0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74  File*)id;.  swit
1eb00 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1eb10 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1eb20 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
1eb30 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1eb40 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1eb50 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  k;.      return 
1eb60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1eb70 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1eb80 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
1eb90 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1eba0 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
1ebb0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
1ebc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1ebd0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1ebe0 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
1ebf0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
1ec00 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
1ec10 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
1ec20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ec30 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1ec40 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ec50 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
1ec60 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1ec70 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1ec80 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1ec90 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48   rc = fcntlSizeH
1eca0 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34  int(pFile, *(i64
1ecb0 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20   *)pArg);.      
1ecc0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1ecd0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1ece0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ecf0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ed00 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
1ed10 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  AL: {.      unix
1ed20 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
1ed30 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
1ed40 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
1ed50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1ed60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1ed70 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ed80 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
1ed90 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
1eda0 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70     unixModeBit(p
1edb0 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50  File, UNIXFILE_P
1edc0 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
1edd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1ede0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1edf0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ee00 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
1ee10 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
1ee20 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
1ee30 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
1ee40 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
1ee50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1ee60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1ee70 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ee80 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
1ee90 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ME: {.      char
1eea0 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74   *zTFile = sqlit
1eeb0 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 46 69 6c 65  e3_malloc( pFile
1eec0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1eed0 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me );.      if( 
1eee0 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  zTFile ){.      
1eef0 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d    unixGetTempnam
1ef00 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  e(pFile->pVfs->m
1ef10 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c  xPathname, zTFil
1ef20 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68  e);.        *(ch
1ef30 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69  ar**)pArg = zTFi
1ef40 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
1ef50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ef60 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1ef70 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ef80 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20  HAS_MOVED: {.   
1ef90 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1efa0 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46   fileHasMoved(pF
1efb0 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ile);.      retu
1efc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1efd0 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
1efe0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1eff0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f000 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  CNTL_MMAP_SIZE: 
1f010 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c  {.      i64 newL
1f020 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41  imit = *(i64*)pA
1f030 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  rg;.      int rc
1f040 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f050 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
1f060 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  >sqlite3GlobalCo
1f070 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20  nfig.mxMmap ){. 
1f080 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20         newLimit 
1f090 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
1f0a0 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20  onfig.mxMmap;.  
1f0b0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36      }.      *(i6
1f0c0 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  4*)pArg = pFile-
1f0d0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
1f0e0 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
1f0f0 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21  >=0 && newLimit!
1f100 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  =pFile->mmapSize
1f110 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46  Max && pFile->nF
1f120 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  etchOut==0 ){.  
1f130 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
1f140 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69  pSizeMax = newLi
1f150 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mit;.        if(
1f160 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1f170 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1f180 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
1f190 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
1f1a0 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65  rc = unixMapfile
1f1b0 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20  (pFile, -1);.   
1f1c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f1d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f1e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1f1f0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1f200 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
1f210 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
1f220 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
1f230 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
1f240 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
1f250 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
1f260 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
1f270 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
1f280 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
1f290 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
1f2a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1f2b0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
1f2c0 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
1f2d0 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
1f2e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f2f0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
1f300 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
1f310 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
1f320 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
1f330 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f340 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1f350 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1f360 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1f370 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1f380 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
1f390 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
1f3a0 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
1f3b0 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
1f3c0 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
1f3d0 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c   return proxyFil
1f3e0 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70  eControl(id,op,p
1f3f0 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Arg);.    }.#end
1f400 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1f410 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1f420 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1f430 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20  PPLE__) */.  }. 
1f440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1f450 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  OTFOUND;.}../*.*
1f460 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63  * Return the sec
1f470 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tor size in byte
1f480 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  s of the underly
1f490 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65  ing block device
1f4a0 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63   for.** the spec
1f4b0 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73  ified file. This
1f4c0 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
1f4d0 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74  s 512 bytes, but
1f4e0 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65   may be.** large
1f4f0 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63  r for some devic
1f500 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  es..**.** SQLite
1f510 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68   code assumes th
1f520 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e  is function cann
1f530 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f  ot fail. It also
1f540 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a   assumes that.**
1f550 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72   if two files ar
1f560 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  e created in the
1f570 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65   same file-syste
1f580 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  m directory (i.e
1f590 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  ..** a database 
1f5a0 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  and its journal 
1f5b0 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73  file) that the s
1f5c0 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
1f5d0 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66  be the.** same f
1f5e0 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e  or both..*/.#ifn
1f5f0 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a  def __QNXNTO__ .
1f600 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1f610 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1f620 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29  3_file *NotUsed)
1f630 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1f640 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
1f650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1f660 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1f670 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ZE;.}.#endif../*
1f680 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1f690 67 20 76 65 72 73 69 6f 6e 20 6f 66 20 75 6e 69  g version of uni
1f6a0 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  xSectorSize() is
1f6b0 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 51   optimized for Q
1f6c0 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  NX..*/.#ifdef __
1f6d0 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64  QNXNTO__.#includ
1f6e0 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e  e <sys/dcmd_blk.
1f6f0 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
1f700 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61 74  /statvfs.h>.stat
1f710 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f  ic int unixSecto
1f720 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1f730 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
1f740 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1f750 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
1f760 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  ( pFile->sectorS
1f770 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ize == 0 ){.    
1f780 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20 66  struct statvfs f
1f790 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20  sInfo;.       . 
1f7a0 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c     /* Set defaul
1f7b0 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f  ts for non-suppo
1f7c0 72 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d 73  rted filesystems
1f7d0 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   */.    pFile->s
1f7e0 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49  ectorSize = SQLI
1f7f0 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1f800 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c  R_SIZE;.    pFil
1f810 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1f820 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
1f830 20 20 69 66 28 20 66 73 74 61 74 76 66 73 28 70    if( fstatvfs(p
1f840 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f  File->h, &fsInfo
1f850 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20  ) == -1 ) {.    
1f860 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e    return pFile->
1f870 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
1f880 7d 0a 0a 20 20 20 20 69 66 28 20 21 73 74 72 63  }..    if( !strc
1f890 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
1f8a0 74 79 70 65 2c 20 22 74 6d 70 22 29 20 29 20 7b  type, "tmp") ) {
1f8b0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
1f8c0 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
1f8d0 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
1f8e0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1f8f0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
1f900 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1f910 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20  OCAP_ATOMIC4K | 
1f920 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d        /* All ram
1f930 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74   filesystem writ
1f940 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
1f950 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1f960 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1f970 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
1f980 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
1f990 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
1f9d0 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
1f9e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1f9f0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
1fa00 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
1fa10 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
1fa20 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
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 73 6f 20 69 74 20 69 73       ** so it is
1fa60 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
1fa70 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
1fa80 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e   if( strstr(fsIn
1fa90 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1faa0 65 74 66 73 22 29 20 29 7b 0a 20 20 20 20 20 20  etfs") ){.      
1fab0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1fac0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1fad0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1fae0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1faf0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1fb00 20 2f 2a 20 65 74 66 73 20 63 6c 75 73 74 65 72   /* etfs cluster
1fb10 20 73 69 7a 65 20 77 72 69 74 65 73 20 61 72 65   size writes are
1fb20 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
1fb30 20 20 20 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f     (pFile->secto
1fb40 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
1fb50 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fb60 43 35 31 32 29 20 7c 0a 20 20 20 20 20 20 20 20  C512) |.        
1fb70 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1fb80 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1fb90 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1fba0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1fbb0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1fbe0 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1fbf0 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
1fc00 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1fc10 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1fc20 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1fc30 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1fc40 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1fc70 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1fc80 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1fc90 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72    }else if( !str
1fca0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
1fcb0 65 74 79 70 65 2c 20 22 71 6e 78 36 22 29 20 29  etype, "qnx6") )
1fcc0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1fcd0 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1fce0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1fcf0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1fd00 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1fd10 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1fd20 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20  IOCAP_ATOMIC |  
1fd30 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69         /* All fi
1fd40 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20  lesystem writes 
1fd50 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
1fd60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1fd70 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1fd80 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1fd90 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1fda0 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdd0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1fde0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1fdf0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1fe00 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1fe10 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1fe20 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1fe30 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1fe70 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1fe80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1fe90 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
1fea0 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
1feb0 78 34 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x4") ){.      pF
1fec0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1fed0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
1fee0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
1fef0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1ff00 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f  tics =.        /
1ff10 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66  * full bitset of
1ff20 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61   atomics from ma
1ff30 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e  x sector size an
1ff40 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  d smaller */.   
1ff50 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65       ((pFile->se
1ff60 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a  ctorSize / 512 *
1ff70 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1ff80 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d  OMIC512) << 1) -
1ff90 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c   2 |.        SQL
1ffa0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1ffb0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1ffc0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1ffd0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1ffe0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20000 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
20010 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
20020 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
20030 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
20040 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
20050 79 70 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20  ype, "dos") ){. 
20060 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
20070 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
20080 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
20090 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
200a0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
200b0 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69        /* full bi
200c0 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20  tset of atomics 
200d0 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20  from max sector 
200e0 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72  size and smaller
200f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46   */.        ((pF
20100 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20110 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
20120 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
20130 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20  << 1) - 2 |.    
20140 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
20150 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
20160 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
20170 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
20180 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
201c0 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
201d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
201e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
201f0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20200 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49  s =.        SQLI
20210 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
20220 31 32 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f  12 |      /* blo
20230 63 6b 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  cks are atomic *
20240 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
20250 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
20260 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
20270 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
20280 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
20290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
202c0 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
202d0 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
202e0 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63  .  }.  /* Last c
202f0 68 61 6e 63 65 20 76 65 72 69 66 69 63 61 74 69  hance verificati
20300 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 74  on.  If the sect
20310 6f 72 20 73 69 7a 65 20 69 73 6e 27 74 20 61 20  or size isn't a 
20320 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35 31 32 0a  multiple of 512.
20330 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 6e    ** then it isn
20340 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66  't valid.*/.  if
20350 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  ( pFile->sectorS
20360 69 7a 65 20 25 20 35 31 32 20 21 3d 20 30 20 29  ize % 512 != 0 )
20370 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76  {.    pFile->dev
20380 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
20390 63 73 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  cs = 0;.    pFil
203a0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
203b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
203c0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
203d0 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e    return pFile->
203e0 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65  sectorSize;.}.#e
203f0 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f  ndif /* __QNXNTO
20400 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  __ */../*.** Ret
20410 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63  urn the device c
20420 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 66  haracteristics f
20430 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  or the file..**.
20440 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73 20 73  ** This VFS is s
20450 65 74 20 75 70 20 74 6f 20 72 65 74 75 72 6e 20  et up to return 
20460 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
20470 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
20480 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20   by default..** 
20490 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 63 68  However, that ch
204a0 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 61 76 65  oice is contrave
204b0 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65 63 68  rsial since tech
204c0 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e 64 65  nically the unde
204d0 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73  rlying.** file s
204e0 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61  ystem does not a
204f0 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20 70 6f  lways provide po
20500 77 65 72 73 61 66 65 20 6f 76 65 72 77 72 69 74  wersafe overwrit
20510 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a  es.  (In other.*
20520 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72 20 61  * words, after a
20530 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e   power-loss even
20540 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  t, parts of the 
20550 66 69 6c 65 20 74 68 61 74 20 77 65 72 65 20 6e  file that were n
20560 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ever.** written 
20570 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
20580 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20 48 6f  ng altered.)  Ho
20590 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20  wever, non-PSOW 
205a0 62 65 68 61 76 69 6f 72 20 69 73 20 76 65 72 79  behavior is very
205b0 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65 2e 20  ,.** very rare. 
205c0 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67 20 50   And asserting P
205d0 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61 72 67  SOW makes a larg
205e0 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 74  e reduction in t
205f0 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20  he amount.** of 
20600 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66 6f 72  required I/O for
20610 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e   journaling, sin
20620 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61 64 64  ce a lot of padd
20630 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61 74 65  ing is eliminate
20640 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68  d..**  Hence, wh
20650 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  ile POWERSAFE_OV
20660 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20 62 79  ERWRITE is on by
20670 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20   default, there 
20680 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  is a file-contro
20690 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 74  l.** available t
206a0 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20 61 6e  o turn it off an
206b0 64 20 55 52 49 20 71 75 65 72 79 20 70 61 72 61  d URI query para
206c0 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c 65 20  meter available 
206d0 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a  to turn it off..
206e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
206f0 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
20700 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
20710 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
20720 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78  xFile *p = (unix
20730 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
20740 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 5f  rc = 0;.#ifdef _
20750 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66 28 20  _QNXNTO__.  if( 
20760 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30  p->sectorSize==0
20770 20 29 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a   ) unixSectorSiz
20780 65 28 69 64 29 3b 0a 20 20 72 63 20 3d 20 70 2d  e(id);.  rc = p-
20790 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
207a0 69 73 74 69 63 73 3b 0a 23 65 6e 64 69 66 0a 20  istics;.#endif. 
207b0 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c 61 67   if( p->ctrlFlag
207c0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f  s & UNIXFILE_PSO
207d0 57 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d 20 53  W ){.    rc |= S
207e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
207f0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3b  RSAFE_OVERWRITE;
20800 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20810 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
20820 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f  ITE_OMIT_WAL.../
20830 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
20840 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e   to represent an
20850 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
20860 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  uffer.  .**.** W
20870 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72  hen multiple thr
20880 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e  eads all referen
20890 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d  ce the same wal-
208a0 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65  index, each thre
208b0 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77  ad.** has its ow
208c0 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  n unixShm object
208d0 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70  , but they all p
208e0 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
208f0 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20   instance.** of 
20900 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65  this unixShmNode
20910 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
20920 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77  er words, each w
20930 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  al-index is open
20940 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20  ed.** only once 
20950 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
20960 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e  ** Each unixShmN
20970 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  ode object is co
20980 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e  nnected to a sin
20990 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  gle unixInodeInf
209a0 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20  o object..** We 
209b0 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74  could coalesce t
209c0 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  his object into 
209d0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62  unixInodeInfo, b
209e0 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65  ut that would me
209f0 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e  an.** every open
20a00 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20   file that does 
20a10 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d  not use shared m
20a20 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20  emory (in other 
20a30 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f  words, most.** o
20a40 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64  pen files) would
20a50 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61   have to carry a
20a60 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61  round this extra
20a70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53   information.  S
20a80 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f  o.** the unixIno
20a90 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f  deInfo object co
20aa0 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
20ab0 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d   to this unixShm
20ac0 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61  Node object.** a
20ad0 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  nd the unixShmNo
20ae0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  de object is cre
20af0 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e  ated only when n
20b00 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69  eeded..**.** uni
20b10 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  xMutexHeld() mus
20b20 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63  t be true when c
20b30 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72  reating or destr
20b40 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62  oying.** this ob
20b50 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65  ject or while re
20b60 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
20b70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
20b80 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ields:.**.**    
20b90 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65    nRef.**.** The
20ba0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
20bb0 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
20bc0 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
20bd0 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
20be0 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
20bf0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
20c00 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78  *.** Either unix
20c10 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
20c20 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e  st be held or un
20c30 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
20c40 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74  0 and.** unixMut
20c50 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
20c60 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
20c70 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
20c80 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
20c90 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
20ca0 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
20cb0 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f  Node {.  unixIno
20cc0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
20cd0 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65      /* unixInode
20ce0 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74  Info that owns t
20cf0 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a  his SHM node */.
20d00 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
20d10 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
20d20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
20d30 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
20d40 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
20d50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
20d60 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70  ame of the mmapp
20d70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
20d80 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
20d90 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
20da0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
20db0 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
20dc0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
20dd0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65  /* Size of share
20de0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
20df0 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f   */.  u16 nRegio
20e00 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
20e10 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
20e20 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  y apRegion */.  
20e30 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20  u8 isReadonly;  
20e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20e50 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20  ue if read-only 
20e60 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65  */.  char **apRe
20e70 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
20e80 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70  /* Array of mapp
20e90 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
20ea0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
20eb0 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
20ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20ed0 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62  er of unixShm ob
20ee0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
20ef0 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78  o this */.  unix
20f00 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Shm *pFirst;    
20f10 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e         /* All un
20f20 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
20f30 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
20f40 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
20f50 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d  DEBUG.  u8 exclM
20f60 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
20f70 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
20f80 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
20f90 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65  ld */.  u8 share
20fa0 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
20fb0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
20fc0 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
20fd0 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  */.  u8 nextShmI
20fe0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
20ff0 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
21000 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c  e unixShm.id val
21010 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
21020 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
21030 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
21040 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20   by this VFS to 
21050 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65  record the state
21060 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73   of an.** open s
21070 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e  hared memory con
21080 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  nection..**.** T
21090 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
210a0 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  lds are initiali
210b0 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62  zed when this ob
210c0 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
210d0 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d  and.** are read-
210e0 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a  only thereafter:
210f0 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68  .**.**    unixSh
21100 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e  m.pFile.**    un
21110 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  ixShm.id.**.** A
21120 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
21130 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
21140 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69   The unixShm.pFi
21150 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  le->mutex must b
21160 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
21170 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
21180 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
21190 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
211a0 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  hm {.  unixShmNo
211b0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
211c0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
211d0 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ing unixShmNode 
211e0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78  object */.  unix
211f0 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  Shm *pNext;     
21200 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75         /* Next u
21210 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20  nixShm with the 
21220 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65  same unixShmNode
21230 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
21240 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
21250 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
21260 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  ing the unixShmN
21270 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75  ode mutex */.  u
21280 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
21290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
212a0 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
212b0 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e  on within its un
212c0 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  ixShmNode */.  u
212d0 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  16 sharedMask;  
212e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
212f0 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
21300 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20  s held */.  u16 
21310 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
21320 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
21330 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
21340 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  s held */.};../*
21350 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73  .** Constants us
21360 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a  ed for locking.*
21370 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53  /.#define UNIX_S
21380 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53  HM_BASE   ((22+S
21390 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
213a0 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66  *4)         /* f
213b0 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
213c0 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53  /.#define UNIX_S
213d0 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f  HM_DMS    (UNIX_
213e0 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
213f0 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
21400 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
21410 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f  ../*.** Apply po
21420 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
21430 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73  ks for all bytes
21440 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75   from ofst throu
21450 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a  gh ofst+n-1..**.
21460 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69  ** Locks block i
21470 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78  f the mask is ex
21480 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43  actly UNIX_SHM_C
21490 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f   and are non-blo
214a0 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69  cking.** otherwi
214b0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
214c0 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  t unixShmSystemL
214d0 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  ock(.  unixShmNo
214e0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a  de *pShmNode, /*
214f0 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
21500 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
21510 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
21520 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
21530 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  e,          /* F
21540 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c  _UNLCK, F_RDLCK,
21550 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20   or F_WRLCK */. 
21560 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
21570 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
21580 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63   byte of the loc
21590 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20  king range */.  
215a0 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20  int n           
215b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
215c0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
215d0 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
215e0 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20   flock f;       
215f0 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76  /* The posix adv
21600 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74  isory locking st
21610 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
21620 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21630 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
21640 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a  e form fcntl() *
21650 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
21660 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  o the unixShmNod
21670 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
21680 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
21690 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
216a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
216b0 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  held(pShmNode->m
216c0 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64  utex) || pShmNod
216d0 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  e->nRef==0 );.. 
216e0 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73   /* Shared locks
216f0 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65   never span more
21700 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a   than one byte *
21710 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  /.  assert( n==1
21720 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f   || lockType!=F_
21730 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c  RDLCK );..  /* L
21740 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20  ocks are within 
21750 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72  range */.  asser
21760 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c  t( n>=1 && n<SQL
21770 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
21780 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
21790 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->h>=0 ){.    /*
217a0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
217b0 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
217c0 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  rs */.    memset
217d0 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
217e0 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65  ));.    f.l_type
217f0 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20   = lockType;.   
21800 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   f.l_whence = SE
21810 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f  EK_SET;.    f.l_
21820 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20  start = ofst;.  
21830 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a    f.l_len = n;..
21840 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
21850 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f  (pShmNode->h, F_
21860 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20  SETLK, &f);.    
21870 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20  rc = (rc!=(-1)) 
21880 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
21890 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
218a0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
218b0 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
218c0 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
218d0 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
218e0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
218f0 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
21900 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
21910 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f   "));.  mask = o
21920 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20  fst>31 ? 0xffff 
21930 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  : (1<<(ofst+n)) 
21940 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
21950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21960 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
21970 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
21980 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21990 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
219a0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
219b0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
219c0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
219d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
219e0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
219f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
21a00 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
21a10 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
21a20 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
21a30 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
21a40 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
21a50 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
21a60 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21a70 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
21a80 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
21a90 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
21aa0 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
21ab0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
21ac0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
21ad0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
21ae0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
21af0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
21b00 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
21b10 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
21b20 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
21b30 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
21b40 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
21b50 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21b60 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
21b70 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
21b80 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
21b90 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
21ba0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
21bb0 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
21bc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21bd0 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
21be0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
21bf0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21c00 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
21c10 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
21c20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
21c30 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
21c40 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
21c50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
21c60 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
21c70 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
21c80 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
21c90 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
21ca0 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a  ;        .}.../*
21cb0 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
21cc0 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
21cd0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
21ce0 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
21cf0 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
21d00 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
21d10 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21d20 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
21d30 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
21d40 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
21d50 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21d60 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
21d70 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
21d80 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
21d90 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
21da0 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
21db0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
21dc0 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
21dd0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
21de0 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
21df0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
21e00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
21e10 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49  >pInode==pFd->pI
21e20 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  node );.    sqli
21e30 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
21e40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f  ->mutex);.    fo
21e50 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
21e60 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
21e70 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
21e80 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70          osMunmap
21e90 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c  (p->apRegion[i],
21ea0 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   p->szRegion);. 
21eb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21ed0 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29  (p->apRegion[i])
21ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21ef0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21f00 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20  (p->apRegion);. 
21f10 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
21f20 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  {.      robust_c
21f30 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20  lose(pFd, p->h, 
21f40 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
21f50 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20   p->h = -1;.    
21f60 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d  }.    p->pInode-
21f70 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20  >pShmNode = 0;. 
21f80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21f90 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
21fa0 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d   Open a shared-m
21fb0 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63  emory area assoc
21fc0 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20  iated with open 
21fd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44  database file pD
21fe0 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70  bFd.  .** This p
21ff0 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d  articular implem
22000 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d  entation uses mm
22010 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a  apped files..**.
22020 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64  ** The file used
22030 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68   to implement sh
22040 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69  ared-memory is i
22050 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
22060 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f  tory.** as the o
22070 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
22080 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  e and has the sa
22090 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
220a0 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  pen database.** 
220b0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d  file with the "-
220c0 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65  shm" suffix adde
220d0 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  d.  For example,
220e0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
220f0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f   file.** is "/ho
22100 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
22110 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c  db" then the fil
22120 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  e that is create
22130 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a  d and mmapped.**
22140 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f   for shared memo
22150 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ry will be calle
22160 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  d "/home/user1/c
22170 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20  onfig.db-shm".  
22180 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61  .**.** Another a
22190 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f  pproach to is to
221a0 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64   use files in /d
221b0 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74  ev/shm or /dev/t
221c0 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65  mp or an.** some
221d0 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75   other tmpfs mou
221e0 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c  nt. But if a fil
221f0 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  e in a different
22200 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72   directory.** fr
22210 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
22220 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68  file is used, th
22230 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63  en differing acc
22240 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  ess permissions.
22250 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29  ** or a chroot()
22260 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f   might cause two
22270 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65   different proce
22280 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sses on the same
22290 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20  .** database to 
222a0 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66  end up using dif
222b0 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72  ferent files for
222c0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d   shared memory -
222d0 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61   .** meaning tha
222e0 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77  t their memory w
222f0 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20  ould not really 
22300 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75  be shared - resu
22310 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61  lting.** in data
22320 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
22330 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
22340 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20  this tmpfs file 
22350 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20  usage.** can be 
22360 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
22370 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44  le-time using -D
22380 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
22390 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a  TORY="/dev/shm".
223a0 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61  ** or the equiva
223b0 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f  lent.  The use o
223c0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d  f the SQLITE_SHM
223d0 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69  _DIRECTORY compi
223e0 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f  le-time.** optio
223f0 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20  n results in an 
22400 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69  incompatible bui
22410 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62  ld of SQLite;  b
22420 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a  uilds of SQLite.
22430 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66  ** that with dif
22440 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48  fering SQLITE_SH
22450 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74  M_DIRECTORY sett
22460 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20  ings attempt to 
22470 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  use the.** same 
22480 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
22490 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
224a0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
224b0 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  ion will likely.
224c0 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53  ** result. The S
224d0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
224e0 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
224f0 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69   option is consi
22500 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70  dered.** "unsupp
22510 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67  orted" and may g
22520 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75  o away in a futu
22530 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73  re SQLite releas
22540 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  e..**.** When op
22550 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
22560 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
22570 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
22580 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
22590 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
225a0 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
225b0 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
225c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
225d0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
225e0 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
225f0 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
22600 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
22610 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
22620 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67  *.** If the orig
22630 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
22640 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 75 73  le (pDbFd) is us
22650 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78  ing the "unix-ex
22660 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20  cl" VFS.** that 
22670 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78  means that an ex
22680 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
22690 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
226a0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a  base file and.**
226b0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
226c0 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 62 6c  rocesses are abl
226d0 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  e to read or wri
226e0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  te the database.
226f0 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73    In.** that cas
22700 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61  e, we do not rea
22710 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64 20  lly need shared 
22720 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72  memory.  No shar
22730 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c  ed memory.** fil
22740 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
22750 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
22760 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74   will be simulat
22770 65 64 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d  ed with heap mem
22780 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
22790 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65  nt unixOpenShare
227a0 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65  dMemory(unixFile
227b0 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
227c0 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  ct unixShm *p = 
227d0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  0;          /* T
227e0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
227f0 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
22800 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f  struct unixShmNo
22810 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
22820 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
22830 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  g mmapped file *
22840 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
22870 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  de */.  unixInod
22880 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
22890 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
228a0 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20  node of fd */.  
228b0 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61  char *zShmFilena
228c0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
228d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
228e0 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d  ile used for SHM
228f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69   */.  int nShmFi
22900 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
22910 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
22920 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d   the SHM filenam
22930 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
22940 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
22950 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  ce for the new u
22960 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a  nixShm object. *
22970 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  /.  p = sqlite3_
22980 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
22990 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
229a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
229b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
229c0 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
229d0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  ));.  assert( pD
229e0 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  bFd->pShm==0 );.
229f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
22a00 65 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e  ee if a unixShmN
22a10 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61  ode object alrea
22a20 64 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65  dy exists. Reuse
22a30 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
22a40 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74  * one if present
22a50 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f  . Create a new o
22a60 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
22a70 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
22a80 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
22a90 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
22aa0 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  de;.  pShmNode =
22ab0 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
22ac0 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  e;.  if( pShmNod
22ad0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  e==0 ){.    stru
22ae0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b00 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66  * fstat() info f
22b10 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
22b20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c   */..    /* Call
22b30 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75   fstat() to figu
22b40 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69  re out the permi
22b50 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61  ssions on the da
22b60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
22b70 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73      ** a new *-s
22b80 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  hm file is creat
22b90 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77  ed, an attempt w
22ba0 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63  ill be made to c
22bb0 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20  reate it.    ** 
22bc0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 65  with the same pe
22bd0 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a  rmissions..    *
22be0 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
22bf0 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74  t(pDbFd->h, &sSt
22c00 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62  at) && pInode->b
22c10 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
22c20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22c30 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
22c40 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
22c50 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
22c60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
22c70 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
22c80 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
22c90 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48  sizeof(SQLITE_SH
22ca0 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33  M_DIRECTORY) + 3
22cb0 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68  1;.#else.    nSh
22cc0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20  mFilename = 6 + 
22cd0 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46  (int)strlen(pDbF
22ce0 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69  d->zPath);.#endi
22cf0 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
22d00 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
22d10 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
22d20 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  e) + nShmFilenam
22d30 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  e );.    if( pSh
22d40 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
22d50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
22d60 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
22d70 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
22d80 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
22d90 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  ShmNode, 0, size
22da0 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53  of(*pShmNode)+nS
22db0 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
22dc0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   zShmFilename = 
22dd0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
22de0 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53  ame = (char*)&pS
22df0 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65  hmNode[1];.#ifde
22e00 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
22e10 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74  ECTORY.    sqlit
22e20 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
22e30 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
22e40 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  lename, .       
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
22e60 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22e70 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d  RY "/sqlite-shm-
22e80 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20  %x-%x",.        
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
22ea0 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20  2)sStat.st_ino, 
22eb0 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65  (u32)sStat.st_de
22ec0 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71  v);.#else.    sq
22ed0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
22ee0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
22ef0 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  mFilename, "%s-s
22f00 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
22f10 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
22f20 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
22f30 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c  ->zPath, zShmFil
22f40 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
22f50 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
22f60 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e   -1;.    pDbFd->
22f70 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
22f80 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20   = pShmNode;.   
22f90 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
22fa0 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
22fb0 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
22fc0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
22fd0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
22fe0 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
22ff0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
23000 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
23010 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23020 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
23030 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
23040 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
23050 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
23060 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
23070 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
23080 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
23090 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  T;.      if( sql
230a0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
230b0 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22  (pDbFd->zPath, "
230c0 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30  readonly_shm", 0
230d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65  ) ){.        ope
230e0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
230f0 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  Y;.        pShmN
23100 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
23110 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
23120 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
23130 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68   robust_open(zSh
23140 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46  mFilename, openF
23150 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f  lags, (sStat.st_
23160 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20  mode&0777));.   
23170 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
23180 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >h<0 ){.        
23190 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
231a0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
231b0 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
231c0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zShmFilename);. 
231d0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f         goto shm_
231e0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20  open_err;.      
231f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
23200 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72  his process is r
23210 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20  unning as root, 
23220 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
23230 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20  he SHM file.    
23240 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79    ** is owned by
23250 20 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74   the same user t
23260 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69  hat owns the ori
23270 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20  ginal database. 
23280 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
23290 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
232a0 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74  l owner will not
232b0 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e   be able to conn
232c0 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ect..      */.  
232d0 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 70 53 68      osFchown(pSh
232e0 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e  mNode->h, sStat.
232f0 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74  st_uid, sStat.st
23300 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20 20 20 20  _gid);.  .      
23310 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
23320 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
23330 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
23340 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
23350 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e  h..      ** If n
23360 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
23370 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
23380 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ngth. .      */.
23390 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
233a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
233b0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
233c0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
233d0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
233e0 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
233f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
23400 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
23410 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29  (pShmNode->h, 0)
23420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
23430 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
23440 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
23450 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65  OPEN, "ftruncate
23460 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
23470 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23480 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
23490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
234a0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
234b0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
234c0 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
234d0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
234e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
234f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
23500 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
23510 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
23520 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
23530 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
23540 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
23550 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
23560 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
23570 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
23580 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
23590 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
235a0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
235b0 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
235c0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
235d0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
235e0 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
235f0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
23600 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
23610 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
23620 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
23630 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
23640 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
23650 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
23660 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
23670 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
23680 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
23690 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
236a0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
236b0 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
236c0 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
236d0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
236e0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
236f0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
23700 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
23710 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
23720 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
23730 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
23740 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
23750 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
23760 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
23770 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
23780 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
23790 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
237a0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
237b0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
237c0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
237d0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
237e0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
237f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23800 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
23810 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
23820 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
23830 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
23840 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
23850 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
23860 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
23870 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
23880 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
23890 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
238a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
238b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
238c0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
238d0 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
238e0 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
238f0 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
23900 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
23910 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
23920 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
23930 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
23940 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
23950 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
23960 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
23970 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
23980 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
23990 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
239a0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
239b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
239c0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
239d0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
239e0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
239f0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
23a00 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
23a10 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
23a20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
23a30 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
23a40 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
23a50 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
23a60 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
23a70 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
23a80 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
23a90 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
23aa0 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
23ab0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
23ac0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
23ad0 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
23ae0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
23af0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
23b00 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
23b10 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
23b20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
23b30 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
23b40 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
23b50 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
23b60 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
23b70 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
23b80 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
23b90 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
23ba0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
23bb0 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
23bc0 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
23bd0 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
23be0 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
23bf0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
23c00 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
23c10 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
23c20 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
23c30 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
23c40 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
23c50 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
23c60 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
23c70 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
23c80 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
23c90 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
23ca0 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
23cb0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
23cc0 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ce0 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
23cf0 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
23d00 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
23d10 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
23d20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
23d30 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d50 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
23d60 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
23d70 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
23d80 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
23d90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23da0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
23db0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
23dc0 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
23dd0 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
23de0 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
23df0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
23e00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23e10 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  _OK;..  /* If th
23e20 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
23e30 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
23e40 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
23e50 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
23e60 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
23e70 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
23e80 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
23e90 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
23ea0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23eb0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
23ec0 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
23ed0 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
23ee0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
23ef0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
23f00 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
23f10 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
23f20 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
23f30 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
23f40 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
23f50 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  gion==0 );.  ass
23f60 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
23f70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
23f80 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
23f90 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
23fa0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
23fb0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
23fc0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
23fd0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
23fe0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
23ff0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
24000 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
24010 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
24020 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
24030 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
24040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24050 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
24060 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
24070 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
24080 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
24090 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
240a0 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
240b0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
240c0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
240d0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
240e0 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
240f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
24100 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
24110 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  n;..    if( pShm
24120 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
24130 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
24140 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
24150 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
24160 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
24170 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
24180 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
24190 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
241a0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
241b0 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
241c0 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
241d0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
241e0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
241f0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
24200 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
24210 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
24220 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
24230 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
24240 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
24250 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
24260 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24270 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
24280 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
24290 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
242a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
242b0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
242c0 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
242d0 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
242e0 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
242f0 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
24300 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
24310 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
24320 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
24330 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
24340 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
24350 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20  !bExtend ){.    
24360 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
24370 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
24380 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  }..        /* Al
24390 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
243a0 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
243b0 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
243c0 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20  . Do this by.   
243d0 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20       ** writing 
243e0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
243f0 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
24400 20 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67   (OS) page being
24410 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
24420 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
24430 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  d. Technically, 
24440 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69  we need only wri
24450 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  te to the.      
24460 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69    ** last page i
24470 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e  n order to exten
24480 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20  d the file. But 
24490 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e  writing to all n
244a0 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ew.        ** pa
244b0 67 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f  ges forces the O
244c0 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  S to allocate th
244d0 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  em immediately, 
244e0 77 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20  which reduces.  
244f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61        ** the cha
24500 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77  nces of SIGBUS w
24510 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74  hile accessing t
24520 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
24530 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20   later on..     
24540 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c     */.        el
24550 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
24560 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70  atic const int p
24570 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  gsz = 4096;.    
24580 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a        int iPg;..
24590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
245a0 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62  te to the last b
245b0 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c  yte of each newl
245c0 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  y allocated or e
245d0 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a  xtended page */.
245e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
245f0 28 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29  ( (nByte % pgsz)
24600 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
24610 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e   for(iPg=(sStat.
24620 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69  st_size/pgsz); i
24630 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b  Pg<(nByte/pgsz);
24640 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPg++){.       
24650 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
24660 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
24670 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20  ->h, iPg*pgsz + 
24680 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 30  pgsz-1, "", 1, 0
24690 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=1 ){.        
246a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
246b0 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f   *zFile = pShmNo
246c0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  de->zFilename;. 
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
246e0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
246f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
24700 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46  IZE, "write", zF
24710 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
24720 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
24730 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
24740 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
24750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24760 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
24770 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
24780 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
24790 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
247a0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
247b0 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
247c0 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74  = (char **)sqlit
247d0 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
247e0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
247f0 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e  Region, (iRegion
24800 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  +1)*sizeof(char 
24810 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
24820 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
24830 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
24840 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
24850 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24860 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
24870 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20  mNode->apRegion 
24880 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69  = apNew;.    whi
24890 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  le(pShmNode->nRe
248a0 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a  gion<=iRegion){.
248b0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d        void *pMem
248c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d  ;.      if( pShm
248d0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
248e0 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d        pMem = osM
248f0 6d 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c  map(0, szRegion,
24900 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68  .            pSh
24910 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
24920 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20  y ? PROT_READ : 
24930 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57  PROT_READ|PROT_W
24940 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20  RITE, .         
24950 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70     MAP_SHARED, p
24960 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65  ShmNode->h, szRe
24970 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f  gion*(i64)pShmNo
24980 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20  de->nRegion.    
24990 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
249a0 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49  f( pMem==MAP_FAI
249b0 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LED ){.         
249c0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
249d0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
249e0 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20  SHMMAP, "mmap", 
249f0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
24a00 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
24a10 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
24a20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24a40 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f   pMem = sqlite3_
24a50 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29  malloc(szRegion)
24a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
24a70 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  em==0 ){.       
24a80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
24a90 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
24aa0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
24ab0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24ac0 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c      memset(pMem,
24ad0 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   0, szRegion);. 
24ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
24af0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
24b00 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
24b10 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20  n] = pMem;.     
24b20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
24b30 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
24b40 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
24b50 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
24b60 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
24b70 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e  .    *pp = pShmN
24b80 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52  ode->apRegion[iR
24b90 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b  egion];.  }else{
24ba0 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
24bb0 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
24bc0 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20  ->isReadonly && 
24bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
24be0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
24bf0 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ONLY;.  sqlite3_
24c00 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
24c10 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
24c20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24c30 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
24c40 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
24c50 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
24c60 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  gment..**.** Not
24c70 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74  e that the relat
24c80 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
24c90 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55  SHAREd and EXCLU
24ca0 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20  SIVE locks is a 
24cb0 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72  little.** differ
24cc0 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e  ent here than in
24cd0 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d   posix.  In xShm
24ce0 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20  Lock(), one can 
24cf0 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  go from unlocked
24d00 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e  .** to shared an
24d10 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75  d back or from u
24d20 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75  nlocked to exclu
24d30 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20  sive and back.  
24d40 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e  But one may.** n
24d50 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65  ot go from share
24d60 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f  d to exclusive o
24d70 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65  r from exclusive
24d80 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73   to shared..*/.s
24d90 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
24da0 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
24db0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
24dc0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
24dd0 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
24de0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
24df0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e10 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
24e20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
24e30 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24e60 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
24e70 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
24e80 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
24e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
24ea0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
24eb0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
24ec0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
24ed0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
24ee0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
24ef0 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
24f00 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75  ed memory */.  u
24f10 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
24f20 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
24f30 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
24f40 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
24f50 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
24f60 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f80 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
24f90 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
24fa0 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  gs */.  unixShmN
24fb0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
24fc0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a  p->pShmNode;  /*
24fd0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
24fe0 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20  file iNode */.  
24ff0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25000 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
25010 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
25020 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61  code */.  u16 ma
25030 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
25060 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65   to take or rele
25070 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
25080 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
25090 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
250a0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
250b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
250c0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
250d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
250e0 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
250f0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
25100 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
25110 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
25120 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
25130 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
25140 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
25150 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
25160 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
25170 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
25180 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
25190 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
251a0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
251b0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
251c0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
251d0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
251e0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
251f0 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
25200 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
25210 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
25220 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
25230 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
25240 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
25250 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
25260 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
25270 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
25280 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
25290 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
252a0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
252b0 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  ;..  mask = (1<<
252c0 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
252d0 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  ofst);.  assert(
252e0 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
252f0 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
25300 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
25310 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
25320 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
25330 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
25340 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
25350 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
25360 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
25370 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
25380 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
25390 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
253a0 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
253b0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
253c0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
253d0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
253e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
253f0 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
25400 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
25410 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
25420 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
25430 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
25440 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
25450 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
25460 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
25470 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
25480 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
25490 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
254a0 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
254b0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
254c0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
254d0 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f  Node, F_UNLCK, o
254e0 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
254f0 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
25500 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
25510 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
25520 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
25530 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
25540 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
25560 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
25570 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
25580 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
25590 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
255a0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
255b0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
255c0 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
255d0 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
255e0 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
255f0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
25600 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
25610 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
25620 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
25630 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
25640 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
25650 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
25660 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
25670 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
25680 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
25690 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
256a0 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
256b0 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
256c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
256d0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
256e0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
256f0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
25700 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
25710 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
25720 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
25730 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
25740 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
25750 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
25760 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
25770 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
25780 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
25790 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
257a0 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
257b0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
257c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
257d0 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
257e0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
257f0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
25800 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
25810 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
25820 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
25830 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
25840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
25850 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
25860 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
25870 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
25880 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
25890 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
258a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
258b0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
258c0 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
258d0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
258e0 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
258f0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
25900 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
25910 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
25920 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
25930 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
25940 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
25950 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
25960 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
25970 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
25980 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
25990 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
259a0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
259b0 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
259c0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
259d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
259e0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
259f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25a00 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
25a10 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
25a20 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
25a30 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
25a40 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
25a50 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
25a60 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
25a70 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
25a80 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
25a90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25ab0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
25ac0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
25ad0 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_WRLCK, ofst+U
25ae0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
25af0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
25b00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25b10 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
25b20 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
25b30 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
25b40 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
25b50 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
25b60 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
25b70 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
25b80 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
25b90 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
25ba0 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
25bb0 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
25bc0 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
25bd0 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69      p->id, getpi
25be0 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  d(), p->sharedMa
25bf0 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29  sk, p->exclMask)
25c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
25c10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
25c20 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
25c30 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
25c40 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
25c50 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
25c60 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
25c70 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
25c80 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
25c90 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
25ca0 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
25cb0 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
25cc0 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
25cd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
25ce0 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  ixShmBarrier(.  
25cf0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d10 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
25d20 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
25d30 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
25d40 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
25d50 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78 45  TER(fd);.  unixE
25d60 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 75  nterMutex();.  u
25d70 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
25d80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
25d90 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
25da0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
25db0 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
25dc0 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
25dd0 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
25de0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
25df0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
25e00 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
25e10 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
25e20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
25e30 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
25e40 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
25e50 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
25e60 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
25e70 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
25e80 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
25e90 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
25ea0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
25eb0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
25ec0 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
25ed0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
25ee0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
25ef0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
25f00 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
25f30 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
25f40 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
25f50 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
25f60 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
25f70 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
25f80 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
25f90 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25fb0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25fc0 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
25fd0 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
25fe0 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
25ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26000 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
26010 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
26020 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
26030 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
26040 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
26050 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
26060 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
26070 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
26080 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
26090 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
260a0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
260b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
260c0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
260d0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
260e0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
260f0 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
26100 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
26110 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
26120 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
26130 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
26140 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
26150 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
26160 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
26170 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
26180 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
26190 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
261a0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
261b0 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
261c0 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
261d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
261e0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
261f0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
26200 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
26210 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
26220 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
26230 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
26240 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
26250 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
26260 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
26270 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
26280 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
26290 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
262a0 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
262b0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
262c0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
262d0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
262e0 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
262f0 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
26300 30 20 29 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68  0 ) osUnlink(pSh
26310 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
26320 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75  );.    unixShmPu
26330 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a  rge(pDbFd);.  }.
26340 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
26350 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
26360 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c  LITE_OK;.}...#el
26370 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
26380 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
26390 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63  efine unixShmLoc
263a0 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
263b0 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30  unixShmBarrier 0
263c0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
263d0 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
263e0 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
263f0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
26400 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
26410 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
26420 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65  * If it is curre
26430 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70  ntly memory mapp
26440 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70  ed, unmap file p
26450 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Fd..*/.static vo
26460 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
26470 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
26480 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
26490 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
264a0 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
264b0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d  egion ){.    osM
264c0 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52  unmap(pFd->pMapR
264d0 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70  egion, pFd->mmap
264e0 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20  SizeActual);.   
264f0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
26500 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
26510 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
26520 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
26530 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  tual = 0;.  }.}.
26540 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
26550 65 20 73 79 73 74 65 6d 20 70 61 67 65 20 73 69  e system page si
26560 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
26570 74 20 75 6e 69 78 47 65 74 50 61 67 65 73 69 7a  t unixGetPagesiz
26580 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 48 41 56  e(void){.#if HAV
26590 45 5f 4d 52 45 4d 41 50 0a 20 20 72 65 74 75 72  E_MREMAP.  retur
265a0 6e 20 35 31 32 3b 0a 23 65 6c 69 66 20 64 65 66  n 512;.#elif def
265b0 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45  ined(_BSD_SOURCE
265c0 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61  ).  return getpa
265d0 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a  gesize();.#else.
265e0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79    return (int)sy
265f0 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49  sconf(_SC_PAGESI
26600 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  ZE);.#endif.}../
26610 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
26620 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  set the size of 
26630 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
26640 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79  ng maintained by
26650 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69   file .** descri
26660 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77  ptor pFd to nNew
26670 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73   bytes. Any exis
26680 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
26690 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a  discarded..**.**
266a0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
266b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
266c0 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ts the following
266d0 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
266e0 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  *       unixFile
266f0 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20  .pMapRegion.**  
26700 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d       unixFile.mm
26710 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  apSize.**       
26720 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a  unixFile.mmapSiz
26730 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66  eActual.**.** If
26740 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61   unsuccessful, a
26750 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
26760 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71  is logged via sq
26770 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a  lite3_log() and.
26780 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76 61 72  ** the three var
26790 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65  iables above are
267a0 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73   zeroed. In this
267b0 20 63 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f   case SQLite sho
267c0 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  uld.** continue 
267d0 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61  accessing the da
267e0 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
267f0 20 78 52 65 61 64 28 29 20 61 6e 64 20 78 57 72   xRead() and xWr
26800 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73  ite().** methods
26810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26820 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a   unixRemapfile(.
26830 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c    unixFile *pFd,
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26850 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
26860 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ptor object */. 
26870 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20   i64 nNew       
26880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26890 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70   /* Required map
268a0 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a  ping size */.){.
268b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
268c0 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69  rr = "mmap";.  i
268d0 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20  nt h = pFd->h;  
268e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268f0 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
26900 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64  riptor open on d
26910 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  b file */.  u8 *
26920 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46  pOrig = (u8 *)pF
26930 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d->pMapRegion;  
26940 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
26950 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70  urrent file mapp
26960 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72  ing */.  i64 nOr
26970 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ig = pFd->mmapSi
26980 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a  zeActual;     /*
26990 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72   Size of pOrig r
269a0 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a  egion in bytes *
269b0 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30  /.  u8 *pNew = 0
269c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
269d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
269e0 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70  tion of new mapp
269f0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ing */.  int fla
26a00 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20  gs = PROT_READ; 
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a20 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
26a30 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61  o mmap() */..  a
26a40 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
26a50 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73  chOut==0 );.  as
26a60 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e  sert( nNew>pFd->
26a70 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73  mmapSize );.  as
26a80 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d  sert( nNew<=pFd-
26a90 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a  >mmapSizeMax );.
26aa0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
26ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
26ac0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
26ad0 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  l>=pFd->mmapSize
26ae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41   );.  assert( MA
26af0 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a  P_FAILED!=0 );..
26b00 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c    if( (pFd->ctrl
26b10 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
26b20 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c  _RDONLY)==0 ) fl
26b30 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54  ags |= PROT_WRIT
26b40 45 3b 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20  E;..  if( pOrig 
26b50 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
26b60 20 73 7a 53 79 73 70 61 67 65 20 3d 20 75 6e 69   szSyspage = uni
26b70 78 47 65 74 50 61 67 65 73 69 7a 65 28 29 3b 0a  xGetPagesize();.
26b80 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d      i64 nReuse =
26b90 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20   (pFd->mmapSize 
26ba0 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29  & ~(szSyspage-1)
26bb0 29 3b 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20  );.    u8 *pReq 
26bc0 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d  = &pOrig[nReuse]
26bd0 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20  ;..    /* Unmap 
26be0 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68 65  any pages of the
26bf0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
26c00 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65  g that cannot be
26c10 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20   reused. */.    
26c20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69  if( nReuse!=nOri
26c30 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e  g ){.      osMun
26c40 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d  map(pReq, nOrig-
26c50 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a  nReuse);.    }..
26c60 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a  #if HAVE_MREMAP.
26c70 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65      pNew = osMre
26c80 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73  map(pOrig, nReus
26c90 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f  e, nNew, MREMAP_
26ca0 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45  MAYMOVE);.    zE
26cb0 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23  rr = "mremap";.#
26cc0 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20  else.    pNew = 
26cd0 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65  osMmap(pReq, nNe
26ce0 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c  w-nReuse, flags,
26cf0 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20   MAP_SHARED, h, 
26d00 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28  nReuse);.    if(
26d10 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45   pNew!=MAP_FAILE
26d20 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  D ){.      if( p
26d30 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20  New!=pReq ){.   
26d40 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e       osMunmap(pN
26d50 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73  ew, nNew - nReus
26d60 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
26d70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
26d80 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  e{.        pNew 
26d90 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d  = pOrig;.      }
26da0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
26db0 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70     /* The attemp
26dc0 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  t to extend the 
26dd0 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
26de0 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74   failed. Free it
26df0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65  . */.    if( pNe
26e00 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c  w==MAP_FAILED ||
26e10 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
26e20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67    osMunmap(pOrig
26e30 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d  , nReuse);.    }
26e40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e  .  }..  /* If pN
26e50 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c  ew is still NULL
26e60 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  , try to create 
26e70 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20  an entirely new 
26e80 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  mapping. */.  if
26e90 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
26ea0 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30   pNew = osMmap(0
26eb0 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d  , nNew, flags, M
26ec0 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29  AP_SHARED, h, 0)
26ed0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65  ;.  }..  if( pNe
26ee0 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w==MAP_FAILED ){
26ef0 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
26f00 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20     nNew = 0;.   
26f10 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
26f20 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70  LITE_OK, zErr, p
26f30 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20  Fd->zPath);..   
26f40 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28   /* If the mmap(
26f50 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20  ) above failed, 
26f60 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20  assume that all 
26f70 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28  subsequent mmap(
26f80 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77  ) calls.    ** w
26f90 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69  ill probably fai
26fa0 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b  l too. Fall back
26fb0 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f   to using xRead/
26fc0 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76 65  xWrite exclusive
26fd0 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69  ly.    ** in thi
26fe0 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
26ff0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
27000 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d   = 0;.  }.  pFd-
27010 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76  >pMapRegion = (v
27020 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46  oid *)pNew;.  pF
27030 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46  d->mmapSize = pF
27040 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
27050 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  l = nNew;.}../*.
27060 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72  ** Memory map or
27070 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20   remap the file 
27080 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64  opened by file-d
27090 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69  escriptor pFd (i
270a0 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  f the file.** is
270b0 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c   already mapped,
270c0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
270d0 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65  pping is replace
270e0 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f  d by the new). O
270f0 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20  r, if .** there 
27100 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
27110 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69   mapping for thi
27120 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  s file, and ther
27130 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20  e are still .** 
27140 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
27150 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
27160 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
27170 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
27180 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
27190 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
271a0 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
271b0 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
271c0 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20  ted size of .** 
271d0 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63  the mapping to c
271e0 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  reate. Otherwise
271f0 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65  , if nByte is le
27200 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
27210 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  en the .** reque
27220 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65  sted size is the
27230 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
27240 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61  e on disk. The a
27250 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
27260 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70  e.** created map
27270 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74  ping is either t
27280 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
27290 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63  e or the value c
272a0 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73  onfigured .** us
272b0 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ing SQLITE_FCNTL
272c0 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69  _MMAP_LIMIT, whi
272d0 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
272e0 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
272f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
27300 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
27310 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
27320 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
27330 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
27340 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
27350 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
27360 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
27370 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
27380 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
27390 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c  c int unixMapfil
273a0 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c  e(unixFile *pFd,
273b0 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69   i64 nByte){.  i
273c0 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b  64 nMap = nByte;
273d0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
273e0 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c  sert( nMap>=0 ||
273f0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
27400 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d  =0 );.  if( pFd-
27410 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
27420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27430 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
27440 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
27450 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
27460 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
27470 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
27480 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73  n */.    rc = os
27490 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73  Fstat(pFd->h, &s
274a0 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28  tatbuf);.    if(
274b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
274c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
274d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
274e0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  T;.    }.    nMa
274f0 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73  p = statbuf.st_s
27500 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ize;.  }.  if( n
27510 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  Map>pFd->mmapSiz
27520 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70  eMax ){.    nMap
27530 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
27540 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Max;.  }..  if( 
27550 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
27560 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ize ){.    if( n
27570 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  Map>0 ){.      u
27580 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64  nixRemapfile(pFd
27590 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65 6c  , nMap);.    }el
275a0 73 65 7b 0a 20 20 20 20 20 20 75 6e 69 78 55 6e  se{.      unixUn
275b0 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
275c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
275d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
275e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
275f0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
27600 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
27610 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
27620 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
27630 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
27640 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
27650 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
27660 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
27670 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
27680 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
27690 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
276a0 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
276b0 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
276c0 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
276d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
276e0 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
276f0 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
27700 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
27710 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
27720 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
27730 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
27740 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
27750 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
27760 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
27770 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
27780 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
27790 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
277a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
277b0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
277c0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
277d0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
277e0 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
277f0 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
27800 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75  nce by calling u
27810 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f  nixUnfetch()..*/
27820 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27830 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
27840 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
27850 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
27860 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
27870 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
27880 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
27890 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
278a0 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
278b0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
278c0 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
278d0 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66  .  *pp = 0;..#if
278e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
278f0 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
27900 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  d->mmapSizeMax>0
27910 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d   ){.    if( pFd-
27920 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  >pMapRegion==0 )
27930 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
27940 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64   unixMapfile(pFd
27950 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  , -1);.      if(
27960 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27970 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27980 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
27990 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
279a0 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
279b0 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
279c0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
279d0 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
279e0 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
279f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
27a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
27a20 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
27a30 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
27a40 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27a50 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
27a60 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
27a70 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
27a80 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63  call to unixFetc
27a90 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
27aa0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
27ab0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
27ac0 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
27ad0 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
27ae0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
27af0 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
27b00 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69  assed to the uni
27b10 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  xFetch() invocat
27b20 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ion. .**.** Or, 
27b30 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  if the third arg
27b40 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
27b50 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27b60 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
27b70 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  d .** to inform 
27b80 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
27b90 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
27ba0 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
27bb0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a  ting mapping .**
27bc0 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61   may now be inva
27bd0 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
27be0 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73  e unmapped..*/.s
27bf0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
27c00 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  fetch(sqlite3_fi
27c10 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
27c20 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20  , void *p){.#if 
27c30 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
27c40 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c  SIZE>0.  unixFil
27c50 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
27c60 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  le *)fd;   /* Th
27c70 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
27c80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
27c90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
27ca0 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66  (iOff);..  /* If
27cb0 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
27cc0 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
27cd0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
27ce0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
27cf0 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
27d00 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
27d10 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
27d20 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
27d30 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
27d40 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
27d50 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
27d60 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
27d70 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
27d80 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
27d90 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
27da0 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
27db0 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
27dc0 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
27dd0 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
27de0 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
27df0 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
27e00 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
27e10 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
27e20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
27e30 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  nixUnmapfile(pFd
27e40 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
27e50 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
27e60 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55  >=0 );.#else.  U
27e70 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27e80 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
27e90 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e  RAMETER(p);.  UN
27ea0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
27eb0 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  Off);.#endif.  r
27ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
27ee0 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
27ef0 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
27f00 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
27f10 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
27f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
27f30 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
27f40 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
27f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f60 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
27f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27fb0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
27fc0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
27fd0 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
27fe0 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
27ff0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
28000 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
28010 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
28020 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
28030 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
28040 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
28050 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
28060 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
28070 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
28080 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
28090 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
280a0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
280b0 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
280c0 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
280d0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
280e0 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
280f0 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
28100 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
28110 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
28120 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
28130 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
28140 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
28150 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
28160 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
28170 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
28180 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
28190 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
281a0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
281b0 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
281c0 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
281d0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
281e0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
281f0 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
28200 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
28210 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
28220 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
28230 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
28240 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
28250 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
28260 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74  der-funtion F, t
28270 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  wo objects are c
28280 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  reated:.**.**   
28290 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69   (1) The real fi
282a0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61  nder-function na
282b0 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a  med "FImpt()"..*
282c0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f  *.**    (2) A co
282d0 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74  nstant pointer t
282e0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
282f0 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a  named just "F"..
28300 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  **.**.** A point
28310 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e  er to the F poin
28320 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74  ter is used as t
28330 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75  he pAppData valu
28340 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a  e for VFS.** obj
28350 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74  ects.  We have t
28360 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61  o do this instea
28370 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70  d of letting pAp
28380 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64  pData point.** d
28390 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66  irectly at the f
283a0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73  inder-function s
283b0 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70  ince C90 rules p
283c0 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a  revent a void*.*
283d0 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69  * from be cast i
283e0 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  nto a function p
283f0 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  ointer..**.**.**
28400 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
28410 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e  f this macro gen
28420 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63  erates two objec
28430 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ts:.**.**   *  A
28440 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65   constant sqlite
28450 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
28460 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20  ect call METHOD 
28470 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67  that has locking
28480 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73  .**      methods
28490 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
284a0 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e  LOCK, CKRESLOCK.
284b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49  .**.**   *  An I
284c0 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  /O method finder
284d0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
284e0 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74   FINDER that ret
284f0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  urns a pointer.*
28500 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45  *      to the ME
28510 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74  THOD object in t
28520 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c  he previous bull
28530 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  et..*/.#define I
28540 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c  OMETHODS(FINDER,
28550 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e   METHOD, VERSION
28560 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  , CLOSE, LOCK, U
28570 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20  NLOCK, CKLOCK)  
28580 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
28590 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
285a0 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b  thods METHOD = {
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c     \.   VERSION,
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285f0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
28600 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28620 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20    \.   CLOSE,   
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28640 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20     /* xClose */ 
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28670 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20   \.   unixRead, 
28680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28690 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20  \.   unixWrite, 
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286e0 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20   /* xWrite */   
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28710 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  .   unixTruncate
28720 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28730 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28760 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20     unixSync,    
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28780 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20  * xSync */      
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
287b0 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20    unixFileSize, 
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
287d0 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28800 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20   LOCK,          
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28820 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  xLock */        
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28850 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  UNLOCK,         
28860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28870 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  Unlock */       
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
288a0 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  KLOCK,          
288b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
288c0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
288d0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
288e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
288f0 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
28900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
28910 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28930 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28940 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  xSectorSize,    
28950 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
28960 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  torSize */      
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28990 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
289a0 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69  stics,  /* xDevi
289b0 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a  ceCapabilities *
289c0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
289d0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
289e0 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
289f0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
28a00 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
28a30 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
28a40 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
28a50 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
28a80 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
28a90 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
28aa0 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ier */          
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55     \.   unixShmU
28ad0 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  nmap,           
28ae0 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
28af0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68    \.   unixFetch
28b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28b30 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20     /* xFetch */ 
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63   \.   unixUnfetc
28b70 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
28b80 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bb0 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28c00 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
28c10 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28c20 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
28c30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
28c40 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
28c50 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28c60 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
28c70 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28ca0 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20              \.} 
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d30 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
28d40 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
28d50 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
28d60 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
28d70 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
28d80 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
28d90 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
28da0 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
28db0 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
28dc0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
28dd0 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
28de0 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
28df0 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
28e00 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
28e10 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
28e20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
28e30 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
28e40 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
28e50 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
28e60 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
28e70 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
28e80 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
28e90 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
28ea0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
28eb0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
28ec0 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20   name */.  3,   
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ee0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
28ef0 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61  emory and mmap a
28f00 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  re enabled */.  
28f10 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
28f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
28f30 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
28f40 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
28f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
28f60 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
28f70 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nixUnlock,      
28f80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
28f90 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
28fa0 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
28fb0 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68  dLock     /* xCh
28fc0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
28fd0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
28fe0 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49  THODS(.  nolockI
28ff0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
29000 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
29010 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
29020 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  nolockIoMethods,
29030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
29040 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29050 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29060 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
29070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29080 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
29090 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c  isabled */.  nol
290a0 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
290b0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
290c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
290d0 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
290e0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
290f0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
29100 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
29110 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29120 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
29130 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
29140 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b  Lock   /* xCheck
29150 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29160 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
29170 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  DS(.  dotlockIoF
29180 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29190 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
291a0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74  on name */.  dot
291b0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
291c0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
291d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
291e0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29200 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
29210 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
29220 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  bled */.  dotloc
29230 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
29240 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
29250 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
29260 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
29270 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
29280 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
29290 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
292a0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
292b0 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
292c0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
292d0 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ck  /* xCheckRes
292e0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
292f0 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54   */.)..#if SQLIT
29300 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
29310 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
29320 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
29330 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  .  flockIoFinder
29340 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29350 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
29360 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49  name */.  flockI
29370 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
29380 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
29390 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
293a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
293b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293c0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
293d0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
293e0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73  d */.  flockClos
293f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
29400 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
29410 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b  d */.  flockLock
29420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29430 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
29440 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   */.  flockUnloc
29450 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29460 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
29470 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63  d */.  flockChec
29480 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
29490 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
294a0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
294b0 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
294c0 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
294d0 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
294e0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
294f0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
29500 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
29510 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
29520 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29530 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29540 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
29550 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29560 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29570 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
29580 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c  abled */.  semCl
29590 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
295a0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
295b0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f  ethod */.  semLo
295c0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
295d0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
295e0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c  thod */.  semUnl
295f0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29600 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
29610 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68  ethod */.  semCh
29620 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29630 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
29640 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29650 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
29660 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
29670 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
29680 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29690 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
296a0 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20    afpIoFinder,  
296b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
296c0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
296d0 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65  ame */.  afpIoMe
296e0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
296f0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
29700 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
29710 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
29720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29730 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
29740 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
29750 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20   */.  afpClose, 
29760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29770 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
29780 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20   */.  afpLock,  
29790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297a0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
297b0 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20  */.  afpUnlock, 
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
297d0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
297e0 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65   */.  afpCheckRe
297f0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
29800 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
29810 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
29820 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
29830 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  The proxy lockin
29840 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73  g method is a "s
29850 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20  uper-method" in 
29860 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69  the sense that i
29870 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e  t.** opens secon
29880 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  dary file descri
29890 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f  ptors for the co
298a0 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c  nch and lock fil
298b0 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65  es and.** it use
298c0 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c  s proxy, dot-fil
298d0 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63  e, AFP, and floc
298e0 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  k() locking meth
298f0 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20  ods on those.** 
29900 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e  secondary files.
29910 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
29920 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
29930 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a  that implements.
29940 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** proxy locking
29950 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68   is located much
29960 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e   further down in
29970 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20   the file.  But 
29980 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f  we need.** to go
29990 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e   ahead and defin
299a0 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  e the sqlite3_io
299b0 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e  _methods and fin
299c0 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  der function.** 
299d0 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
299e0 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66  g here.  So we f
299f0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74  orward declare t
29a00 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a  he I/O methods..
29a10 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
29a20 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
29a30 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
29a40 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20  NG_STYLE.static 
29a50 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73  int proxyClose(s
29a60 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73  qlite3_file*);.s
29a70 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
29a80 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
29a90 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
29aa0 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
29ab0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
29ac0 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
29ad0 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
29ae0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
29af0 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d  ile*, int*);.IOM
29b00 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49  ETHODS(.  proxyI
29b10 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
29b20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29b30 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29b40 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c   proxyIoMethods,
29b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
29b60 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29b70 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
29b80 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
29b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29ba0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
29bb0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72  disabled */.  pr
29bc0 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
29bd0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
29be0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
29bf0 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
29c00 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29c10 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
29c20 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
29c30 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29c40 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
29c50 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
29c60 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63  Lock    /* xChec
29c70 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29c80 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
29c90 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f  ../* nfs lockd o
29ca0 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73  n OSX 10.3+ does
29cb0 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20  n't clear write 
29cc0 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61  locks when a rea
29cd0 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f  d lock is set */
29ce0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
29cf0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
29d00 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
29d10 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
29d20 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c  (.  nfsIoFinder,
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29d40 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
29d50 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49  n name */.  nfsI
29d60 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
29d70 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
29d80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
29d90 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
29da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29db0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29dc0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
29dd0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
29de0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
29df0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
29e00 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
29e10 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
29e20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29e30 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55  method */.  nfsU
29e40 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
29e50 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29e60 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
29e70 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
29e80 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
29e90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29ea0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
29eb0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
29ec0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
29ed0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
29ee0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
29ef0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
29f00 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
29f10 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
29f20 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
29f30 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
29f40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29f50 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
29f60 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
29f70 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
29f80 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
29f90 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
29fa0 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
29fb0 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
29fc0 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
29fd0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
29fe0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29ff0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
2a000 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
2a010 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
2a020 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
2a030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2a040 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
2a050 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
2a060 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2a070 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2a080 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
2a090 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2a0a0 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
2a0b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2a0c0 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
2a0d0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
2a0e0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
2a0f0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
2a100 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2a110 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
2a120 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
2a130 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
2a140 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
2a150 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
2a160 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
2a170 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
2a180 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
2a190 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
2a1a0 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
2a1b0 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
2a1c0 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
2a1d0 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
2a1e0 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
2a1f0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
2a200 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
2a210 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
2a220 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
2a230 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
2a240 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
2a250 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
2a260 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
2a270 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
2a280 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2a290 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
2a2a0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
2a2b0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2a2c0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
2a2d0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2a2e0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
2a2f0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
2a300 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
2a310 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
2a320 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
2a330 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
2a340 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2a350 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
2a360 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
2a370 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
2a380 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
2a390 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2a3a0 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2a3b0 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
2a3c0 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
2a3d0 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
2a3e0 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
2a3f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2a400 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
2a410 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
2a420 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
2a430 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
2a440 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
2a450 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
2a460 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
2a470 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
2a480 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
2a490 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
2a4a0 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
2a4b0 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
2a4c0 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
2a4d0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
2a4e0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
2a4f0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
2a500 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
2a510 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
2a520 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
2a530 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
2a540 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
2a550 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
2a560 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2a570 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
2a580 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a590 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
2a5a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2a5b0 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
2a5c0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2a5d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2a5e0 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
2a5f0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2a600 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2a610 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2a620 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
2a630 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
2a640 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2a650 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
2a660 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
2a670 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
2a680 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2a690 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2a6a0 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
2a6b0 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51  OS_VXWORKS && SQ
2a6c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2a6d0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
2a6e0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
2a6f0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
2a700 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2a710 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
2a720 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
2a730 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a740 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
2a750 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
2a760 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
2a770 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
2a780 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2a790 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
2a7a0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
2a7b0 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a   VXWorks only..*
2a7c0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2a7d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a7e0 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  s *autolockIoFin
2a7f0 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74  derImpl(.  const
2a800 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c   char *filePath,
2a810 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
2a820 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a830 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2a840 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f  pNew           /
2a850 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  * the open file 
2a860 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
2a870 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
2a880 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69  Info;..  if( !fi
2a890 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a  lePath ){.    /*
2a8a0 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55   If filePath==NU
2a8b0 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  LL that means we
2a8c0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2a8d0 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  h a transient fi
2a8e0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  le.    ** that d
2a8f0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2a900 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  be locked. */.  
2a910 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
2a920 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a  IoMethods;.  }..
2a930 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e    /* Test if fcn
2a940 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65  tl() is supporte
2a950 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20  d and use POSIX 
2a960 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a  style locks..  *
2a970 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
2a980 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d   back to the nam
2a990 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74  ed semaphore met
2a9a0 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  hod..  */.  lock
2a9b0 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
2a9c0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
2a9d0 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
2a9e0 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
2a9f0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
2aa00 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
2aa10 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
2aa20 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
2aa30 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
2aa40 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
2aa50 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
2aa60 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
2aa70 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
2aa80 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
2aa90 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2aaa0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
2aab0 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
2aac0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
2aad0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2aae0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
2aaf0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
2ab00 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
2ab10 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2ab20 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
2ab30 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
2ab40 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
2ab50 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
2ab60 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
2ab70 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
2ab80 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
2ab90 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
2aba0 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
2abb0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2abc0 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
2abd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac10 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2ac20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
2ac40 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
2ac50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac60 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
2ac70 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
2ac80 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2ac90 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
2aca0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
2acb0 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
2acc0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2acd0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2ace0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
2acf0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
2ad00 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
2ad10 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
2ad20 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
2ad30 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2ad40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2ad50 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
2ad60 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
2ad70 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2ad80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2ad90 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
2ada0 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
2adb0 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
2adc0 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
2add0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
2ade0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2adf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2ae00 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
2ae10 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
2ae20 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
2ae30 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20   ctrlFlags      
2ae40 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
2ae50 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20  more UNIXFILE_* 
2ae60 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63  values */.){.  c
2ae70 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2ae80 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
2ae90 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
2aea0 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
2aeb0 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
2aec0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2aed0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
2aee0 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
2aef0 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  );..  /* Usually
2af00 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e   the path zFilen
2af10 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ame should not b
2af20 65 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  e a relative pat
2af30 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20  hname. The.  ** 
2af40 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65  exception is whe
2af50 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72  n opening the pr
2af60 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65  oxy "conch" file
2af70 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a   in builds that.
2af80 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65    ** include the
2af90 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c   special Apple l
2afa0 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20  ocking styles.. 
2afb0 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
2afc0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2afd0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2afe0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65  ING_STYLE.  asse
2aff0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
2b000 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
2b010 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56  =='/' .    || pV
2b020 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76  fs->pAppData==(v
2b030 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
2b040 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a  Finder );.#else.
2b050 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2b060 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
2b070 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23  ame[0]=='/' );.#
2b080 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c  endif..  /* No l
2b090 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e  ocking occurs in
2b0a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
2b0b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46   */.  assert( zF
2b0c0 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63  ilename!=0 || (c
2b0d0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
2b0e0 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29  ILE_NOLOCK)!=0 )
2b0f0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
2b100 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
2b110 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
2b120 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68  );.  pNew->h = h
2b130 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d  ;.  pNew->pVfs =
2b140 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a   pVfs;.  pNew->z
2b150 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2b160 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c  ;.  pNew->ctrlFl
2b170 61 67 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ags = (unsigned 
2b180 73 68 6f 72 74 29 63 74 72 6c 46 6c 61 67 73 3b  short)ctrlFlags;
2b190 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
2b1a0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e  MMAP_SIZE>0.  pN
2b1b0 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  ew->mmapSizeMax 
2b1c0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2b1d0 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
2b1e0 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
2b1f0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
2b200 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2b210 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
2b220 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
2b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b240 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
2b250 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
2b260 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
2b270 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2b280 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
2b290 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  SOW;.  }.  if( s
2b2a0 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  trcmp(pVfs->zNam
2b2b0 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d  e,"unix-excl")==
2b2c0 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
2b2d0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2b2e0 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a  FILE_EXCL;.  }..
2b2f0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2b300 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
2b310 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
2b320 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
2b330 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
2b340 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c  .    ctrlFlags |
2b350 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
2b360 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
2b370 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
2b380 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c  ndif..  if( ctrl
2b390 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2b3a0 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _NOLOCK ){.    p
2b3b0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26  LockingStyle = &
2b3c0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2b3d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
2b3e0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a  ockingStyle = (*
2b3f0 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70  *(finder_type*)p
2b400 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a  Vfs->pAppData)(z
2b410 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b  Filename, pNew);
2b420 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2b430 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2b440 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46  .    /* Cache zF
2b450 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c  ilename in the l
2b460 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28  ocking context (
2b470 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20  AFP and dotlock 
2b480 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20  override) for.  
2b490 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61    ** proxyLock a
2b4a0 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73  ctivation is pos
2b4b0 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72  sible (remote pr
2b4c0 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20  oxy is based on 
2b4d0 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20  db name).    ** 
2b4e0 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e  zFilename remain
2b4f0 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69  s valid until fi
2b500 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f  le is closed, to
2b510 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20   support */.    
2b520 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2b530 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46  text = (void*)zF
2b540 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ilename;.#endif.
2b550 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b    }..  if( pLock
2b560 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73  ingStyle == &pos
2b570 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20  ixIoMethods.#if 
2b580 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2b590 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2b5a0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2b5b0 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e  E.    || pLockin
2b5c0 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f  gStyle == &nfsIo
2b5d0 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20  Methods.#endif. 
2b5e0 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   ){.    unixEnte
2b5f0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
2b600 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2b610 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2b620 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  node);.    if( r
2b630 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b640 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65        /* If an e
2b650 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
2b660 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2b670 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
2b680 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
2b690 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
2b6a0 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
2b6b0 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
2b6c0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61  ndInodeInfo() ma
2b6d0 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20  y fail.      ** 
2b6e0 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
2b6f0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
2b700 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c   **   (a) A call
2b710 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c   to fstat() fail
2b720 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  ed..      **   (
2b730 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  b) A malloc fail
2b740 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2b750 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28     ** Scenario (
2b760 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  b) may only occu
2b770 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  r if the process
2b780 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f   is holding no o
2b790 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69  ther.      ** fi
2b7a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
2b7b0 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2b7c0 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77  file. If there w
2b7d0 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20  ere other file. 
2b7e0 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
2b7f0 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ors on this file
2b800 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63  , then no malloc
2b810 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72   would be requir
2b820 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66  ed by.      ** f
2b830 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20  indInodeInfo(). 
2b840 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
2b850 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
2b860 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
2b870 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
2b880 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
2b890 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
2b8a0 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
2b8b0 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
2b8c0 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
2b8d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2b8e0 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
2b8f0 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
2b900 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
2b910 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
2b920 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
2b930 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
2b940 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
2b950 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
2b960 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
2b970 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
2b980 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
2b990 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
2b9a0 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
2b9b0 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
2b9c0 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  /.      robust_c
2b9d0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2b9e0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68  LINE__);.      h
2b9f0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2ba00 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2ba10 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
2ba20 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2ba30 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2ba40 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
2ba50 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2ba60 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
2ba70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2ba80 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
2ba90 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2baa0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2bab0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
2bac0 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
2bad0 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
2bae0 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
2baf0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
2bb00 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2bb10 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
2bb20 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2bb30 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  c( sizeof(*pCtx)
2bb40 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
2bb50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2bb60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2bb70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bb80 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
2bb90 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
2bba0 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
2bbb0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
2bbc0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
2bbd0 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
2bbe0 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
2bbf0 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
2bc00 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
2bc10 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
2bc20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
2bc30 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
2bc40 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
2bc50 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65     pCtx->reserve
2bc60 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61  d = 0;.      sra
2bc70 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
2bc80 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2bc90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
2bca0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2bcb0 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2bcc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2bcd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bce0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bcf0 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  e(pNew->lockingC
2bd00 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
2bd10 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2bd20 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2bd30 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
2bd40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bd50 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2bd60 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
2bd70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
2bd80 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2bd90 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
2bda0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2bdb0 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
2bdc0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2bdd0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2bde0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2bdf0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2be00 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
2be10 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
2be20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
2be30 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
2be40 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74  name;.    assert
2be50 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29  ( zFilename!=0 )
2be60 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20  ;.    nFilename 
2be70 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  = (int)strlen(zF
2be80 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20  ilename) + 6;.  
2be90 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63    zLockFile = (c
2bea0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
2beb0 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b  lloc(nFilename);
2bec0 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69  .    if( zLockFi
2bed0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  le==0 ){.      r
2bee0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2bef0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2bf00 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2bf10 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a  ntf(nFilename, z
2bf20 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44  LockFile, "%s" D
2bf30 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a  OTLOCK_SUFFIX, z
2bf40 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
2bf50 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2bf60 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63  ngContext = zLoc
2bf70 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20  kFile;.  }..#if 
2bf80 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73  OS_VXWORKS.  els
2bf90 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
2bfa0 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74  yle == &semIoMet
2bfb0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  hods ){.    /* N
2bfc0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
2bfd0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2bfe0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2bff0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
2c000 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ** included in t
2c010 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e  he semLockingCon
2c020 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  text.    */.    
2c030 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2c040 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
2c050 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2c060 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2c070 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
2c080 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
2c090 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e  >pInode->pSem==N
2c0a0 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ULL) ){.      ch
2c0b0 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70  ar *zSemName = p
2c0c0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2c0d0 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  mName;.      int
2c0e0 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   n;.      sqlite
2c0f0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
2c100 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d  ATHNAME, zSemNam
2c110 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20  e, "/%s.sem",.  
2c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c130 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e       pNew->pId->
2c140 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
2c150 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b  .      for( n=1;
2c160 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b   zSemName[n]; n+
2c170 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20  + ).        if( 
2c180 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27  zSemName[n]=='/'
2c190 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d   ) zSemName[n] =
2c1a0 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77   '_';.      pNew
2c1b0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
2c1c0 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61   sem_open(zSemNa
2c1d0 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36  me, O_CREAT, 066
2c1e0 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  6, 1);.      if(
2c1f0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2c200 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45  Sem == SEM_FAILE
2c210 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  D ){.        rc 
2c220 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2c230 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
2c240 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30  node->aSemName[0
2c250 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
2c260 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
2c270 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2c280 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e  }.#endif.  .  pN
2c290 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ew->lastErrno = 
2c2a0 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  0;.#if OS_VXWORK
2c2b0 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  S.  if( rc!=SQLI
2c2c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2c2d0 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
2c2e0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2c2f0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d  LINE__);.    h =
2c300 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e   -1;.    osUnlin
2c310 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
2c320 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2c330 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
2c340 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  LETE;.  }.#endif
2c350 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2c360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2c370 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  h>=0 ) robust_cl
2c380 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
2c390 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b  INE__);.  }else{
2c3a0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68  .    pNew->pMeth
2c3b0 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79  od = pLockingSty
2c3c0 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  le;.    OpenCoun
2c3d0 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72  ter(+1);.    ver
2c3e0 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b  ifyDbFile(pNew);
2c3f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2c410 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
2c420 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69  directory in whi
2c430 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72  ch to put tempor
2c440 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66  ary files..** If
2c450 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d   no suitable tem
2c460 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72 65  porary file dire
2c470 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75  ctory can be fou
2c480 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  nd, return NULL.
2c490 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2c4a0 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46   char *unixTempF
2c4b0 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20  ileDir(void){.  
2c4c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2c4d0 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a  r *azDirs[] = {.
2c4e0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a       0,.     0,.
2c4f0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
2c500 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
2c510 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
2c520 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20  /tmp",.     0   
2c530 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72       /* List ter
2c540 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a  minator */.  };.
2c550 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
2c560 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
2c570 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
2c580 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20  r *zDir = 0;..  
2c590 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69  azDirs[0] = sqli
2c5a0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
2c5b0 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72  ry;.  if( !azDir
2c5c0 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d  s[1] ) azDirs[1]
2c5d0 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
2c5e0 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 69 66  E_TMPDIR");.  if
2c5f0 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61  ( !azDirs[2] ) a
2c600 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e  zDirs[2] = geten
2c610 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 66  v("TMPDIR");.  f
2c620 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
2c630 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
2c640 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72  azDirs[0]); zDir
2c650 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20  =azDirs[i++]){. 
2c660 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29     if( zDir==0 )
2c670 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2c680 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20  f( osStat(zDir, 
2c690 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  &buf) ) continue
2c6a0 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44  ;.    if( !S_ISD
2c6b0 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  IR(buf.st_mode) 
2c6c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c6d0 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a 44 69  if( osAccess(zDi
2c6e0 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  r, 07) ) continu
2c6f0 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;.    break;.  
2c700 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b  }.  return zDir;
2c710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2c720 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2c730 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
2c740 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c   zBuf must be al
2c750 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  located.** by th
2c760 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73  e calling proces
2c770 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69  s and must be bi
2c780 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
2c790 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66   at least.** pVf
2c7a0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  s->mxPathname by
2c7b0 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
2c7c0 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
2c7d0 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
2c7e0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  r *zBuf){.  stat
2c7f0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
2c800 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  d char zChars[] 
2c810 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
2c820 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
2c830 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
2c840 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
2c850 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
2c860 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64  789";.  unsigned
2c870 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e   int i, j;.  con
2c880 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 0a  st char *zDir;..
2c890 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
2c8a0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
2c8b0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
2c8c0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
2c8d0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
2c8e0 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
2c8f0 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
2c900 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
2c910 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
2c920 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
2c930 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  g. .  */.  Simul
2c940 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2c950 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
2c960 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69  );..  zDir = uni
2c970 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a  xTempFileDir();.
2c980 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
2c990 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f  zDir = ".";..  /
2c9a0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2c9b0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
2c9c0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
2c9d0 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
2c9e0 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65   file .  ** name
2c9f0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
2ca00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2ca10 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ROR..  */.  if( 
2ca20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20  (strlen(zDir) + 
2ca30 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45  strlen(SQLITE_TE
2ca40 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20  MP_FILE_PREFIX) 
2ca50 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a 65 5f 74  + 18) >= (size_t
2ca60 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74  )nBuf ){.    ret
2ca70 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2ca80 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  ;.  }..  do{.   
2ca90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2caa0 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c  f(nBuf-18, zBuf,
2cab0 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d   "%s/"SQLITE_TEM
2cac0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
2cad0 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69  Dir);.    j = (i
2cae0 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b  nt)strlen(zBuf);
2caf0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
2cb00 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
2cb10 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  f[j]);.    for(i
2cb20 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
2cb30 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  ++){.      zBuf[
2cb40 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
2cb50 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
2cb60 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
2cb70 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
2cb80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
2cb90 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 42 75  [j] = 0;.    zBu
2cba0 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 7d 77  f[j+1] = 0;.  }w
2cbb0 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a  hile( osAccess(z
2cbc0 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72  Buf,0)==0 );.  r
2cbd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cbe0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
2cbf0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2cc00 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
2cc10 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
2cc20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73  Routine to trans
2cc30 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20  form a unixFile 
2cc40 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63  into a proxy-loc
2cc50 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a  king unixFile..*
2cc60 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2cc70 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f   in the proxy-lo
2cc80 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74  ck division, but
2cc90 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65   used by unixOpe
2cca0 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45  n().** if SQLITE
2ccb0 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2ccc0 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64  CKING is defined
2ccd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cce0 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
2ccf0 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a  ixFile(unixFile*
2cd00 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
2cd10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
2cd20 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
2cd30 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2cd40 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
2cd50 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
2cd60 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74  se .** file (not
2cd70 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61   a journal or ma
2cd80 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
2cd90 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  e) identified by
2cda0 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61   pathname.** zPa
2cdb0 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  th with SQLITE_O
2cdc0 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61  PEN_XXX flags ma
2cdd0 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73  tching those pas
2cde0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2cdf0 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f  d.** argument to
2ce00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2ce10 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c  **.** Such a fil
2ce20 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79  e descriptor may
2ce30 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61   exist if a data
2ce40 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2ce50 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75  was closed.** bu
2ce60 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
2ce70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ce80 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c   could not be cl
2ce90 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d  osed because som
2cea0 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20  e.** other file 
2ceb0 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
2cec0 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
2ced0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69   is holding a fi
2cee0 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65  le-lock..** Refe
2cef0 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  r to comments in
2cf00 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29   the unixClose()
2cf10 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68   function and th
2cf20 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e  e lengthy commen
2cf30 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  t.** describing 
2cf40 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20  "Posix Advisory 
2cf50 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20  Locking" at the 
2cf60 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69  start of this fi
2cf70 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68  le for .** furth
2cf80 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f  er details. Also
2cf90 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a  , ticket #4018..
2cfa0 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61  **.** If a suita
2cfb0 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
2cfc0 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  tor is found, th
2cfd0 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  en it is returne
2cfe0 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68  d. If no.** such
2cff0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2d000 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20   is located, -1 
2d010 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2d020 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65  static UnixUnuse
2d030 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c  dFd *findReusabl
2d040 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eFd(const char *
2d050 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73  zPath, int flags
2d060 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  ){.  UnixUnusedF
2d070 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  d *pUnused = 0;.
2d080 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61  .  /* Do not sea
2d090 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
2d0a0 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
2d0b0 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f  r on vxworks. No
2d0c0 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76  t because.  ** v
2d0d0 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74  xworks would not
2d0e0 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68   benefit from th
2d0f0 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67  e change (it mig
2d100 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75  ht, we're not su
2d110 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65  re),.  ** but be
2d120 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20  cause no way to 
2d130 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65  test it is curre
2d140 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20  ntly available. 
2d150 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20  It is better .  
2d160 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62  ** not to risk b
2d170 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20  reaking vxworks 
2d180 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20  support for the 
2d190 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20  sake of such an 
2d1a0 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65  obscure .  ** fe
2d1b0 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21  ature.  */.#if !
2d1c0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
2d1d0 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1f0 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20    /* Results of 
2d200 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a  stat() call */..
2d210 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61    /* A stat() ca
2d220 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20  ll may fail for 
2d230 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e  various reasons.
2d240 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
2d250 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d  , it is.  ** alm
2d260 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74  ost certain that
2d270 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20   an open() call 
2d280 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
2d290 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e   will also fail.
2d2a0 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72  .  ** For this r
2d2b0 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72  eason, if an err
2d2c0 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
2d2d0 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72   stat() call her
2d2e0 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67  e, it is.  ** ig
2d2f0 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20  nored and -1 is 
2d300 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
2d310 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f  ller will try to
2d320 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
2d330 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
2d340 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
2d350 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74  h, fail, and ret
2d360 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  urn an error to 
2d370 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a  SQLite..  **.  *
2d380 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73  * Even if a subs
2d390 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61  equent open() ca
2d3a0 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c  ll does succeed,
2d3b0 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65   the consequence
2d3c0 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65  s of.  ** not se
2d3d0 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65  arching for a re
2d3e0 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73  susable file des
2d3f0 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20  criptor are not 
2d400 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  dire.  */.  if( 
2d410 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
2d420 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2d430 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
2d440 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78  Inode;..    unix
2d450 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2d460 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
2d470 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
2d480 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f   pInode && (pIno
2d490 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d  de->fileId.dev!=
2d4a0 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20  sStat.st_dev.   
2d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4c0 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c    || pInode->fil
2d4d0 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73  eId.ino!=sStat.s
2d4e0 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
2d4f0 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
2d500 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
2d510 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
2d520 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
2d530 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
2d540 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
2d550 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
2d560 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
2d570 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
2d580 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
2d590 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
2d5a0 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
2d5b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
2d5c0 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
2d5d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d5e0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2d5f0 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
2d600 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
2d610 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
2d620 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
2d630 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2d640 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75  n is called by u
2d650 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74  nixOpen() to det
2d660 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20  ermine the unix 
2d670 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74  permissions.** t
2d680 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c  o create new fil
2d690 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65  es with. If no e
2d6a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
2d6b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
2d6c0 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
2d6d0 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20   value suitable 
2d6e0 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74  for passing as t
2d6f0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2d700 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a  t to open(2) is.
2d710 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
2d720 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65  Mode. If an IO e
2d730 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
2d740 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2d750 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
2d760 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2d770 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74  of *pMode is not
2d780 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
2d790 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 63   In most cases c
2d7a0 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ases, this routi
2d7b0 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  ne sets *pMode t
2d7c0 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  o 0, which will 
2d7d0 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64  become.** an ind
2d7e0 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73  ication to robus
2d7f0 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61  t_open() to crea
2d800 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e  te the file usin
2d810 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41  g.** SQLITE_DEFA
2d820 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2d830 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79  IONS adjusted by
2d840 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42   the umask..** B
2d850 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62  ut if the file b
2d860 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
2d870 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20   WAL or regular 
2d880 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2d890 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
2d8a0 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65  tion queries the
2d8b0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2d8c0 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
2d8d0 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72   on the .** corr
2d8e0 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
2d8f0 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  se file and sets
2d900 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20   *pMode to this 
2d910 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20  value. Whenever 
2d920 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41  .** possible, WA
2d930 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  L and journal fi
2d940 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
2d950 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
2d960 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61  ermissions .** a
2d970 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
2d980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2d990 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
2d9a0 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
2d9b0 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65  AMES option is e
2d9c0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
2d9d0 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  .** original fil
2d9e0 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c  ename is unavail
2d9f0 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e  able.  But 8_3_N
2da00 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65  AMES is only use
2da10 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c  d for.** FAT fil
2da20 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72  esystems and per
2da30 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  missions do not 
2da40 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f  matter there, so
2da50 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65   just use.** the
2da60 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   default permiss
2da70 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
2da80 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
2da90 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
2daa0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2dab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2dac0 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
2dad0 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
2dae0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
2daf0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2db00 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2db10 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
2db20 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
2db30 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
2db40 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
2db50 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2db60 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
2db70 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
2db80 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
2db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dba0 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74     /* OUT: uid t
2dbb0 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2dbc0 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  e */.  gid_t *pG
2dbd0 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
2dbe0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
2dbf0 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2dc00 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
2dc10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2dc20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2dc30 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2dc40 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20    *pMode = 0;.  
2dc50 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47  *pUid = 0;.  *pG
2dc60 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c  id = 0;.  if( fl
2dc70 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2dc80 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2dc90 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2dca0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
2dcb0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
2dcc0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
2dcd0 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
2dce0 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
2dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2dd10 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
2dd20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
2dd30 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
2dd40 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2dd50 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
2dd60 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2dd70 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
2dd80 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
2dd90 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
2dda0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2ddb0 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
2ddc0 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
2ddd0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
2dde0 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
2ddf0 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
2de00 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
2de10 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
2de20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
2de30 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
2de40 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2de50 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
2de60 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2de70 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
2de80 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2de90 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20  urnalNN".    ** 
2dea0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2deb0 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20  walNN".    **.  
2dec0 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73    ** where NN is
2ded0 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65   a decimal numbe
2dee0 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67  r. The NN naming
2def0 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
2df00 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
2df10 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
2df20 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
2df30 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
2df40 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2df50 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53  ) - 1; .#ifdef S
2df60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
2df70 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65  _NAMES.    while
2df80 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69 74  ( nDb>0 && sqlit
2df90 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b  e3Isalnum(zPath[
2dfa0 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20  nDb]) ) nDb--;. 
2dfb0 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c     if( nDb==0 ||
2dfc0 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27   zPath[nDb]!='-'
2dfd0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2dfe0 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77  _OK;.#else.    w
2dff0 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d  hile( zPath[nDb]
2e000 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61  !='-' ){.      a
2e010 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a  ssert( nDb>0 );.
2e020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50        assert( zP
2e030 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29  ath[nDb]!='\n' )
2e040 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20  ;.      nDb--;. 
2e050 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2e060 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74  memcpy(zDb, zPat
2e070 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62  h, nDb);.    zDb
2e080 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [nDb] = '\0';.. 
2e090 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74     if( 0==osStat
2e0a0 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b  (zDb, &sStat) ){
2e0b0 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  .      *pMode = 
2e0c0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
2e0d0 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55 69  0777;.      *pUi
2e0e0 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64  d = sStat.st_uid
2e0f0 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d 20  ;.      *pGid = 
2e100 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20  sStat.st_gid;.  
2e110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2e120 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2e130 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
2e140 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
2e150 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
2e160 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20  LETEONCLOSE ){. 
2e170 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30     *pMode = 0600
2e180 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2e190 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
2e1a0 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e   the file zPath.
2e1b0 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73  .** .** Previous
2e1c0 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f  ly, the SQLite O
2e1d0 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72  S layer used thr
2e1e0 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ee functions in 
2e1f0 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  place of this.**
2e200 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   one:.**.**     
2e210 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
2e220 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20  dWrite();.**    
2e230 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
2e240 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20  adOnly();.**    
2e250 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
2e260 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a  clusive();.**.**
2e270 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72   These calls cor
2e280 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
2e290 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
2e2a0 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a  tions of flags:.
2e2b0 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72  **.**     ReadWr
2e2c0 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45  ite() ->     (RE
2e2d0 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
2e2e0 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c  ).**     ReadOnl
2e2f0 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41  y()  ->     (REA
2e300 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f  DONLY) .**     O
2e310 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d  penExclusive() -
2e320 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43  > (READWRITE | C
2e330 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56  REATE | EXCLUSIV
2e340 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64  E).**.** The old
2e350 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2e360 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c   accepted a bool
2e370 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22  ean argument - "
2e380 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20  delFlag". If.** 
2e390 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77  true, the file w
2e3a0 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  as configured to
2e3b0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
2e3c0 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  y deleted when t
2e3d0 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c  he.** file handl
2e3e0 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68  e closed. To ach
2e3f0 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66  ieve the same ef
2e400 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20  fect using this 
2e410 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63  new .** interfac
2e420 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54  e, add the DELET
2e430 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f  EONCLOSE flag to
2e440 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
2e450 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f   above for .** O
2e460 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a  penExclusive()..
2e470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2e480 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ixOpen(.  sqlite
2e490 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2e4a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
2e4b0 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  S for which this
2e4c0 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65   is the xOpen me
2e4d0 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
2e4e0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2e4f0 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61         /* Pathna
2e500 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
2e510 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
2e520 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2e530 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2e540 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e550 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e   to be filled in
2e560 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e580 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67     /* Input flag
2e590 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  s to control the
2e5a0 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   opening */.  in
2e5b0 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
2e5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2e5d0 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72  tput flags retur
2e5e0 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f  ned to SQLite co
2e5f0 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  re */.){.  unixF
2e600 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69  ile *p = (unixFi
2e610 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  le *)pFile;.  in
2e620 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  t fd = -1;      
2e630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e640 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2e650 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
2e660 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e  () */.  int open
2e670 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
2e680 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
2e690 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28  to pass to open(
2e6a0 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  ) */.  int eType
2e6b0 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
2e6c0 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
2e6d0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2e6e0 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20  .  int noLock;  
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e700 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
2e710 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  t locking primit
2e720 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ives */.  int rc
2e730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2e740 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
2e750 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
2e760 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c   */.  int ctrlFl
2e770 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
2e780 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45       /* UNIXFILE
2e790 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69  _* flags */..  i
2e7a0 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
2e7b0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e7c0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
2e7d0 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
2e7e0 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
2e7f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
2e800 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
2e810 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
2e820 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e830 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
2e840 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
2e850 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
2e860 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e870 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
2e880 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
2e890 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
2e8a0 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53  EADWRITE);.#if S
2e8b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2e8c0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
2e8d0 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20   isAutoProxy  = 
2e8e0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2e8f0 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b  OPEN_AUTOPROXY);
2e900 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
2e910 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
2e920 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2e930 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2e940 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
2e950 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Info;.#endif..  
2e960 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
2e970 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d   master or main-
2e980 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  file journal, th
2e990 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
2e9a0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c   open.  ** a fil
2e9b0 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e-descriptor on 
2e9c0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
2e9d0 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  o. The first tim
2e9e0 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a  e unixSync().  *
2e9f0 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  * is called the 
2ea00 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
2ea10 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
2ea20 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20  e fsync()ed and 
2ea30 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20  close()d..  */. 
2ea40 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28   int syncDir = (
2ea50 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
2ea60 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
2ea70 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
2ea80 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
2ea90 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2eaa0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2eab0 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
2eac0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2ead0 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  .  ));..  /* If 
2eae0 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
2eaf0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
2eb00 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2eb10 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
2eb20 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
2eb30 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
2eb40 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
2eb50 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
2eb60 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
2eb70 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
2eb80 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f  ATHNAME+2];.  co
2eb90 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
2eba0 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43  = zPath;..  /* C
2ebb0 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
2ebc0 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
2ebd0 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
2ebe0 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
2ebf0 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
2ec00 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
2ec10 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
2ec20 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
2ec30 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
2ec40 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
2ec50 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
2ec60 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
2ec70 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
2ec80 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
2ec90 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
2eca0 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
2ecb0 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
2ecc0 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
2ecd0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
2ece0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
2ecf0 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
2ed00 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
2ed10 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
2ed20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
2ed30 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
2ed40 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
2ed50 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
2ed60 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
2ed70 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
2ed80 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
2ed90 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
2eda0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
2edb0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
2edc0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
2edd0 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
2ede0 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
2edf0 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
2ee00 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
2ee10 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
2ee20 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
2ee30 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
2ee40 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2ee50 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2ee60 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2ee70 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
2ee80 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2ee90 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2eea0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2eeb0 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
2eec0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2eed0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2eee0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2eef0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
2ef00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
2ef10 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2ef20 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2ef30 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
2ef40 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
2ef50 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
2ef60 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
2ef70 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
2ef80 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
2ef90 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
2efa0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2efb0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2efc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
2efd0 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
2efe0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2eff0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
2f000 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f010 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
2f020 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
2f030 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
2f040 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
2f050 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2f060 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
2f070 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
2f080 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2f090 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
2f0a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2f0b0 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  N_WAL.  );..  /*
2f0c0 20 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68   Detect a pid ch
2f0d0 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74  ange and reset t
2f0e0 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20  he PRNG.  There 
2f0f0 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
2f100 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75  ion.  ** here su
2f110 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d  ch that two or m
2f120 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ore threads all 
2f130 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64  trying to open d
2f140 61 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a  atabases at.  **
2f150 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e   the same instan
2f160 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65  t might all rese
2f170 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74  t the PRNG.  But
2f180 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73   multiple resets
2f190 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65  .  ** are harmle
2f1a0 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ss..  */.  if( r
2f1b0 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 67 65  andomnessPid!=ge
2f1c0 74 70 69 64 28 29 20 29 7b 0a 20 20 20 20 72 61  tpid() ){.    ra
2f1d0 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 67 65  ndomnessPid = ge
2f1e0 74 70 69 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  tpid();.    sqli
2f1f0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30  te3_randomness(0
2f200 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73  ,0);.  }..  mems
2f210 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
2f220 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69  unixFile));..  i
2f230 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
2f240 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
2f250 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46  .    UnixUnusedF
2f260 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20  d *pUnused;.    
2f270 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65  pUnused = findRe
2f280 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20  usableFd(zName, 
2f290 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
2f2a0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2f2b0 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
2f2c0 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
2f2d0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
2f2e0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
2f2f0 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
2f300 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73        if( !pUnus
2f310 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ed ){.        re
2f320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f330 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
2f340 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20  .    p->pUnused 
2f350 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20  = pUnused;..    
2f360 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2f370 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65  names are double
2f380 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
2f390 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
2f3a0 0a 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74  .    ** URIs wit
2f3b0 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
2f3c0 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
2f3d0 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
2f3e0 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  into.    ** sqli
2f3f0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
2f400 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  r(). */.    asse
2f410 72 74 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  rt( (flags & SQL
2f420 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c  ITE_OPEN_URI) ||
2f430 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
2f440 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20  ame)+1]==0 );.. 
2f450 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
2f460 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
2f470 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
2f480 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
2f490 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
2f4a0 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
2f4b0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
2f4c0 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20  && !syncDir);.  
2f4d0 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65    rc = unixGetTe
2f4e0 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e  mpname(MAX_PATHN
2f4f0 41 4d 45 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65 29  AME+2, zTmpname)
2f500 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2f510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f520 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2f530 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54  }.    zName = zT
2f540 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20  mpname;..    /* 
2f550 47 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72  Generated tempor
2f560 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ary filenames ar
2f570 65 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d  e always double-
2f580 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a  zero terminated.
2f590 20 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62      ** for use b
2f5a0 79 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  y sqlite3_uri_pa
2f5b0 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20  rameter(). */.  
2f5c0 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b    assert( zName[
2f5d0 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d  strlen(zName)+1]
2f5e0 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
2f5f0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76   Determine the v
2f600 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67  alue of the flag
2f610 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73  s parameter pass
2f620 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63  ed to POSIX func
2f630 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29  tion.  ** open()
2f640 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20  . These must be 
2f650 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20  calculated even 
2f660 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74  if open() is not
2f670 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a   called, as.  **
2f680 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f   they may be sto
2f690 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
2f6a0 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61  he file handle a
2f6b0 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a  nd used by the .
2f6c0 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65    ** 'conch file
2f6d0 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69  ' locking functi
2f6e0 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a  ons later on.  *
2f6f0 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  /.  if( isReadon
2f700 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20  ly )  openFlags 
2f710 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69  |= O_RDONLY;.  i
2f720 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
2f730 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2f740 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72  RDWR;.  if( isCr
2f750 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c  eate )    openFl
2f760 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
2f770 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
2f780 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
2f790 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c   (O_EXCL|O_NOFOL
2f7a0 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67  LOW);.  openFlag
2f7b0 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c  s |= (O_LARGEFIL
2f7c0 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20  E|O_BINARY);..  
2f7d0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2f7e0 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b  mode_t openMode;
2f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f800 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
2f810 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68  create file with
2f820 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69   */.    uid_t ui
2f830 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2f840 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20        /* Userid 
2f850 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
2f860 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20      gid_t gid;  
2f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f880 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72    /* Groupid for
2f890 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
2f8a0 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
2f8b0 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
2f8c0 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65  flags, &openMode
2f8d0 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20  , &uid, &gid);. 
2f8e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f8f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2f900 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65  sert( !p->pUnuse
2f910 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
2f920 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
2f930 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79  _OPEN_WAL || eTy
2f940 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2f950 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
2f960 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f970 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20  .    }.    fd = 
2f980 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
2f990 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
2f9a0 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54  enMode);.    OST
2f9b0 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25  RACE(("OPENX   %
2f9c0 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66  -3d %s 0%o\n", f
2f9d0 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  d, zName, openFl
2f9e0 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66  ags));.    if( f
2f9f0 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49  d<0 && errno!=EI
2fa00 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72  SDIR && isReadWr
2fa10 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
2fa20 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
2fa30 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74  Failed to open t
2fa40 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  he file for read
2fa50 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
2fa60 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f  ry read-only. */
2fa70 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20  .      flags &= 
2fa80 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ~(SQLITE_OPEN_RE
2fa90 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
2faa0 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20  PEN_CREATE);.   
2fab0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20     openFlags &= 
2fac0 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  ~(O_RDWR|O_CREAT
2fad0 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  );.      flags |
2fae0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2faf0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70  ADONLY;.      op
2fb00 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
2fb10 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61  NLY;.      isRea
2fb20 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
2fb30 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2fb40 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
2fb50 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
2fb60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c     }.    if( fd<
2fb70 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2fb80 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2fb90 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2fba0 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65  T, "open", zName
2fbb0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  );.      goto op
2fbc0 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
2fbd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2fbe0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75  is process is ru
2fbf0 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e  nning as root an
2fc00 64 20 69 66 20 63 72 65 61 74 69 6e 67 20 61 20  d if creating a 
2fc10 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20  new rollback.   
2fc20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57   ** journal or W
2fc30 41 4c 20 66 69 6c 65 2c 20 73 65 74 20 74 68 65  AL file, set the
2fc40 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
2fc50 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c  e journal or WAL
2fc60 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74 68   to be.    ** th
2fc70 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72  e same as the or
2fc80 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e  iginal database.
2fc90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2fca0 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
2fcb0 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
2fcc0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2fcd0 4c 29 20 29 7b 0a 20 20 20 20 20 20 6f 73 46 63  L) ){.      osFc
2fce0 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67 69  hown(fd, uid, gi
2fcf0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  d);.    }.  }.  
2fd00 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29 3b  assert( fd>=0 );
2fd10 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
2fd20 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61   ){.    *pOutFla
2fd30 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
2fd40 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75 73 65  .  if( p->pUnuse
2fd50 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75  d ){.    p->pUnu
2fd60 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
2fd70 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c    p->pUnused->fl
2fd80 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
2fd90 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  ..  if( isDelete
2fda0 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
2fdb0 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a  KS.    zPath = z
2fdc0 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Name;.#else.    
2fdd0 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b  osUnlink(zName);
2fde0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20  .#endif.  }.#if 
2fdf0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2fe00 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c  CKING_STYLE.  el
2fe10 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46  se{.    p->openF
2fe20 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
2fe30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2fe40 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d  noLock = eType!=
2fe50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2fe60 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66  _DB;..  .#if def
2fe70 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2fe80 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
2fe90 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2fea0 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c   if( fstatfs(fd,
2feb0 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
2fec0 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
2fed0 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45  e*)pFile)->lastE
2fee0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
2fef0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2ff00 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2ff10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ff20 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
2ff30 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20  .  }.  if (0 == 
2ff40 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c  strncmp("msdos",
2ff50 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65   fsInfo.f_fstype
2ff60 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20  name, 5)) {.    
2ff70 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
2ff80 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53  e)->fsFlags |= S
2ff90 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
2ffa0 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64  _MSDOS;.  }.#end
2ffb0 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  if..  /* Set up 
2ffc0 61 70 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c  appropriate ctrl
2ffd0 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69  Flags */.  if( i
2ffe0 73 44 65 6c 65 74 65 20 29 20 20 20 20 20 20 20  sDelete )       
2fff0 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
30000 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
30010 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52  ELETE;.  if( isR
30020 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20  eadonly )       
30030 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
30040 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f   |= UNIXFILE_RDO
30050 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  NLY;.  if( noLoc
30060 6b 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  k )             
30070 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
30080 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
30090 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72  K;.  if( syncDir
300a0 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
300b0 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
300c0 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
300d0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
300e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
300f0 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ) ctrlFlags |= U
30100 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69  NIXFILE_URI;..#i
30110 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
30120 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69  LOCKING_STYLE.#i
30130 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
30140 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20  PROXY_LOCKING.  
30150 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b  isAutoProxy = 1;
30160 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73  .#endif.  if( is
30170 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50  AutoProxy && (zP
30180 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21  ath!=NULL) && (!
30190 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d  noLock) && pVfs-
301a0 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68  >xOpen ){.    ch
301b0 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67  ar *envforce = g
301c0 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f  etenv("SQLITE_FO
301d0 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
301e0 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65  G");.    int use
301f0 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Proxy = 0;..    
30200 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  /* SQLITE_FORCE_
30210 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31  PROXY_LOCKING==1
30220 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77   means force alw
30230 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30  ays use proxy, 0
30240 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e   means .    ** n
30250 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20  ever use proxy, 
30260 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70  NULL means use p
30270 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63  roxy for non-loc
30280 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20  al files only.  
30290 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f  */.    if( envfo
302a0 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  rce!=NULL ){.   
302b0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74     useProxy = at
302c0 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a  oi(envforce)>0;.
302d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
302e0 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61 74   if( statfs(zPat
302f0 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
30300 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
30310 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
30320 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20 69 73  lose(fd) call is
30330 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49 66   sub-optimal. If
30340 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
30350 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
30360 20 66 64 20 69 73 20 61 20 64 61 74 61 62 61 73   fd is a databas
30370 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  e file, and ther
30380 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f 6e 6e  e are other conn
30390 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20 20  ections open.   
303a0 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74 20       ** on that 
303b0 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 63 75  file that are cu
303c0 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67 20  rrently holding 
303d0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6f  advisory locks o
303e0 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  n it,.        **
303f0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74   then the call t
30400 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20 63  o close() will c
30410 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63 6b  ancel those lock
30420 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65 2c 0a  s. In practice,.
30430 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27 72 65          ** we're
30440 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 73   assuming that s
30450 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27 74 20  tatfs() doesn't 
30460 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65 6e 2e  fail very often.
30470 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   At least.      
30480 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20 6f    ** not while o
30490 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
304a0 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62 79 20  ptors opened by 
304b0 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
304c0 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   on.        ** t
304d0 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61 72 65  he same file are
304e0 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20   working.  */.  
304f0 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45 72 72        p->lastErr
30500 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
30510 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
30520 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
30530 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
30540 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
30550 45 53 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ESS;.        got
30560 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
30570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
30580 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e  seProxy = !(fsIn
30590 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c  fo.f_flags&MNT_L
305a0 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  OCAL);.    }.   
305b0 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b   if( useProxy ){
305c0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c  .      rc = fill
305d0 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
305e0 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74   fd, pFile, zPat
305f0 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20  h, ctrlFlags);. 
30600 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30610 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30620 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e    rc = proxyTran
30630 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75  sformUnixFile((u
30640 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20  nixFile*)pFile, 
30650 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20  ":auto:");.     
30660 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30680 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f    /* Use unixClo
30690 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74  se to clean up t
306a0 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64 64  he resources add
306b0 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78  ed in fillInUnix
306c0 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20  File .          
306d0 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c  ** and clear all
306e0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27 73   the structure's
306f0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70   references.  Sp
30700 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20  ecifically, .   
30710 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d         ** pFile-
30720 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62  >pMethods will b
30730 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65  e NULL so sqlite
30740 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65  3OsClose will be
30750 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20   a no-op .      
30760 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
30770 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65   unixClose(pFile
30780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
30790 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
307a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
307b0 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
307c0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ed;.    }.  }.#e
307d0 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66  ndif.  .  rc = f
307e0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
307f0 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a  fs, fd, pFile, z
30800 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29  Path, ctrlFlags)
30810 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  ;..open_finished
30820 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
30830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
30840 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e  ite3_free(p->pUn
30850 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  used);.  }.  ret
30860 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
30870 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 44 65  c int unixOpenDe
30880 66 65 72 72 65 64 28 0a 20 20 73 71 6c 69 74 65  ferred(.  sqlite
30890 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
308a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
308b0 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  S for which this
308c0 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65   is the xOpen me
308d0 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
308e0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
308f0 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61         /* Pathna
30900 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
30910 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
30920 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
30930 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
30940 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
30950 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e   to be filled in
30960 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
30970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30980 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67     /* Input flag
30990 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  s to control the
309a0 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   opening */.  in
309b0 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
309c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
309d0 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72  tput flags retur
309e0 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f  ned to SQLite co
309f0 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  re */.){.  const
30a00 20 69 6e 74 20 6d 61 73 6b 31 20 3d 20 53 51 4c   int mask1 = SQL
30a10 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
30a20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
30a30 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20  EADWRITE.       
30a40 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
30a50 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
30a60 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6d 61 73  .  const int mas
30a70 6b 32 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  k2 = SQLITE_OPEN
30a80 5f 52 45 41 44 4f 4e 4c 59 20 20 7c 20 53 51 4c  _READONLY  | SQL
30a90 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
30aa0 4e 43 4c 4f 53 45 0a 20 20 20 20 20 20 20 20 20  NCLOSE.         
30ab0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
30ac0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
30ad0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41   | SQLITE_OPEN_A
30ae0 55 54 4f 50 52 4f 58 59 3b 0a 0a 20 20 2f 2a 20  UTOPROXY;..  /* 
30af0 49 66 20 61 6c 6c 20 74 68 65 20 66 6c 61 67 73  If all the flags
30b00 20 69 6e 20 6d 61 73 6b 31 20 61 72 65 20 73 65   in mask1 are se
30b10 74 2c 20 61 6e 64 20 61 6c 6c 20 74 68 65 20 66  t, and all the f
30b20 6c 61 67 73 20 69 6e 20 6d 61 73 6b 32 20 61 72  lags in mask2 ar
30b30 65 0a 20 20 2a 2a 20 63 6c 65 61 72 2c 20 74 68  e.  ** clear, th
30b40 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
30b50 65 78 69 73 74 20 62 75 74 20 74 68 65 20 64 69  exist but the di
30b60 72 65 63 74 6f 72 79 20 64 6f 65 73 20 61 6e 64  rectory does and
30b70 20 69 73 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c   is.  ** writabl
30b80 65 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  e, then this is 
30b90 61 20 64 65 66 65 72 72 65 64 20 6f 70 65 6e 2e  a deferred open.
30ba0 20 20 2a 2f 0a 20 20 69 66 28 20 30 20 26 26 20    */.  if( 0 && 
30bb0 7a 50 61 74 68 20 26 26 20 28 66 6c 61 67 73 20  zPath && (flags 
30bc0 26 20 28 6d 61 73 6b 31 20 7c 20 6d 61 73 6b 32  & (mask1 | mask2
30bd0 29 29 3d 3d 6d 61 73 6b 31 20 29 7b 0a 20 20 20  ))==mask1 ){.   
30be0 20 69 6e 74 20 70 6f 73 69 78 72 63 3b 0a 20 20   int posixrc;.  
30bf0 20 20 70 6f 73 69 78 72 63 20 3d 20 6f 73 41 63    posixrc = osAc
30c00 63 65 73 73 28 7a 50 61 74 68 2c 20 46 5f 4f 4b  cess(zPath, F_OK
30c10 29 3b 0a 20 20 20 20 69 66 28 20 70 6f 73 69 78  );.    if( posix
30c20 72 63 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  rc && errno==ENO
30c30 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ENT ){.      cha
30c40 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50  r zDirname[MAX_P
30c50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20 20 20  ATHNAME+1];.    
30c60 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
30c70 6f 72 28 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e  or(i=(int)strlen
30c80 28 7a 50 61 74 68 29 3b 20 69 3e 31 20 26 26 20  (zPath); i>1 && 
30c90 7a 50 61 74 68 5b 69 5d 21 3d 27 2f 27 3b 20 69  zPath[i]!='/'; i
30ca0 2d 2d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  --);.      memcp
30cb0 79 28 7a 44 69 72 6e 61 6d 65 2c 20 7a 50 61 74  y(zDirname, zPat
30cc0 68 2c 20 69 29 3b 0a 20 20 20 20 20 20 7a 44 69  h, i);.      zDi
30cd0 72 6e 61 6d 65 5b 69 5d 20 3d 20 27 5c 30 27 3b  rname[i] = '\0';
30ce0 0a 20 20 20 20 20 20 70 6f 73 69 78 72 63 20 3d  .      posixrc =
30cf0 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72 6e 61   osAccess(zDirna
30d00 6d 65 2c 20 57 5f 4f 4b 29 3b 0a 20 20 20 20 20  me, W_OK);.     
30d10 20 69 66 28 20 70 6f 73 69 78 72 63 3d 3d 30 20   if( posixrc==0 
30d20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 46  ){.        unixF
30d30 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69  ile *p = (unixFi
30d40 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 20 20 20  le*)pFile;.     
30d50 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
30d60 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
30d70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4d  );.        p->pM
30d80 65 74 68 6f 64 20 3d 20 28 2a 2a 28 66 69 6e 64  ethod = (**(find
30d90 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70  er_type*)pVfs->p
30da0 41 70 70 44 61 74 61 29 28 30 2c 20 30 29 3b 0a  AppData)(0, 0);.
30db0 20 20 20 20 20 20 20 20 70 2d 3e 70 56 66 73 20          p->pVfs 
30dc0 3d 20 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20  = pVfs;.        
30dd0 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20  p->h = -1;.     
30de0 20 20 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20     p->ctrlFlags 
30df0 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 46 45 52  = UNIXFILE_DEFER
30e00 52 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  RED;.        if(
30e10 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
30e20 6c 65 61 6e 28 28 28 66 6c 61 67 73 20 26 20 55  lean(((flags & U
30e30 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a  NIXFILE_URI) ? z
30e40 50 61 74 68 20 3a 20 30 29 2c 0a 20 20 20 20 20  Path : 0),.     
30e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e60 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51        "psow", SQ
30e70 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f  LITE_POWERSAFE_O
30e80 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20  VERWRITE) ){.   
30e90 20 20 20 20 20 20 20 70 2d 3e 63 74 72 6c 46 6c         p->ctrlFl
30ea0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
30eb0 50 53 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a  PSOW;.        }.
30ec0 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 46          p->openF
30ed0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
30ee0 20 20 20 20 20 20 70 2d 3e 7a 50 61 74 68 20 3d        p->zPath =
30ef0 20 7a 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20   zPath;.        
30f00 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 20  if( pOutFlags ) 
30f10 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
30f20 67 73 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  gs;.        retu
30f30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30f40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
30f50 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4f 70 65    return unixOpe
30f60 6e 28 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 70  n(pVfs, zPath, p
30f70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 70 4f 75  File, flags, pOu
30f80 74 46 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  tFlags);.}../*.*
30f90 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * Delete the fil
30fa0 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74  e at zPath. If t
30fb0 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d  he dirSync argum
30fc0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79  ent is true, fsy
30fd0 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65  nc().** the dire
30fe0 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
30ff0 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ting the file..*
31000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
31010 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  xDelete(.  sqlit
31020 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
31030 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74       /* VFS cont
31040 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74  aining this as t
31050 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f  he xDelete metho
31060 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
31070 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
31080 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
31090 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a   to be deleted *
310a0 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20  /.  int dirSync 
310b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
310c0 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28   If true, fsync(
310d0 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  ) directory afte
310e0 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20  r deleting file 
310f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
31100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e   SQLITE_OK;.  UN
31110 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
31120 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c  otUsed);.  Simul
31130 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
31140 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
31150 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73  ELETE);.  if( os
31160 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28  Unlink(zPath)==(
31170 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65  -1) ){.    if( e
31180 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a  rrno==ENOENT ){.
31190 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
311a0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
311b0 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OENT;.    }else{
311c0 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
311d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
311e0 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
311f0 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
31200 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
31210 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66   rc;.  }.#ifndef
31220 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
31230 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64  DIRSYNC.  if( (d
31240 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29  irSync & 1)!=0 )
31250 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
31260 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
31270 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
31280 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
31290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
312a0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
312b0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
312c0 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
312d0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
312e0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
312f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
31300 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
31310 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
31320 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74  C, "fsync", zPat
31330 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
31340 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
31350 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
31360 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
31370 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
31380 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EN ){.      rc =
31390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
313a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
313b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
313c0 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73  ** Test the exis
313d0 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65  tence of or acce
313e0 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  ss permissions o
313f0 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68  f file zPath. Th
31400 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72  e.** test perfor
31410 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  med depends on t
31420 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67  he value of flag
31430 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  s:.**.**     SQL
31440 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
31450 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  S: Return 1 if t
31460 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a  he file exists.*
31470 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
31480 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52  ESS_READWRITE: R
31490 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
314a0 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20  ile is read and 
314b0 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  writable..**    
314c0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
314d0 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20  EADONLY: Return 
314e0 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
314f0 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a   readable..**.**
31500 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
31510 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
31520 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20  nt unixAccess(. 
31530 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
31540 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20  tUsed,   /* The 
31550 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
31560 68 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68  his xAccess meth
31570 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
31580 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
31590 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66  /* Path of the f
315a0 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a  ile to examine *
315b0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
315c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
315d0 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74  hat do we want t
315e0 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68  o learn about th
315f0 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f  e zPath file? */
31600 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
31610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
31620 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65  ite result boole
31630 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  an here */.){.  
31640 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20  int amode = 0;. 
31650 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
31660 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
31670 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
31680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
31690 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
316a0 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
316b0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
316c0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
316d0 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f        amode = F_
316e0 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
316f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
31700 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
31710 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  E:.      amode =
31720 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20   W_OK|R_OK;.    
31730 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
31740 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
31750 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64  READ:.      amod
31760 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = R_OK;.      
31770 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
31780 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
31790 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
317a0 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
317b0 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28  }.  *pResOut = (
317c0 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20  osAccess(zPath, 
317d0 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66  amode)==0);.  if
317e0 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ( flags==SQLITE_
317f0 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 26 26  ACCESS_EXISTS &&
31800 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20   *pResOut ){.   
31810 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
31820 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53  ;.    if( 0==osS
31830 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29  tat(zPath, &buf)
31840 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d   && buf.st_size=
31850 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  =0 ){.      *pRe
31860 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  sOut = 0;.    }.
31870 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
31880 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
31890 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
318a0 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
318b0 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
318c0 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   The relative pa
318d0 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  th.** is stored 
318e0 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  as a nul-termina
318f0 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68  ted string in th
31900 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
31910 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e   to by.** zPath.
31920 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69   .**.** zOut poi
31930 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
31940 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69  of at least sqli
31950 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
31960 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e  me bytes .** (in
31970 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f   this case, MAX_
31980 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e  PATHNAME bytes).
31990 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69   The full-path i
319a0 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  s written to.** 
319b0 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f  this buffer befo
319c0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
319d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
319e0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
319f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
31a00 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
31a10 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
31a20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
31a30 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
31a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
31a50 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
31a60 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
31a70 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20  nt nOut,        
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31a90 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
31aa0 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
31ab0 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20  /.  char *zOut  
31ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ad0 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
31ae0 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49  er */.){..  /* I
31af0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
31b00 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
31b10 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
31b20 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
31b30 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
31b40 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
31b50 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
31b60 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
31b70 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
31b80 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
31b90 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
31ba0 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
31bb0 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
31bc0 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
31bd0 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
31be0 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
31bf0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
31c00 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
31c10 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61  TE_ERROR );..  a
31c20 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50  ssert( pVfs->mxP
31c30 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54  athname==MAX_PAT
31c40 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45  HNAME );.  UNUSE
31c50 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
31c60 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d  );..  zOut[nOut-
31c70 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28  1] = '\0';.  if(
31c80 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29   zPath[0]=='/' )
31c90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
31ca0 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
31cb0 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
31cc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
31cd0 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20  t nCwd;.    if( 
31ce0 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e  osGetcwd(zOut, n
31cf0 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  Out-1)==0 ){.   
31d00 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
31d10 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
31d20 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65  NTOPEN_BKPT, "ge
31d30 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20  tcwd", zPath);. 
31d40 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20     }.    nCwd = 
31d50 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74  (int)strlen(zOut
31d60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
31d70 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77  nprintf(nOut-nCw
31d80 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20  d, &zOut[nCwd], 
31d90 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20  "/%s", zPath);. 
31da0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
31db0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  TE_OK;.}...#ifnd
31dc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
31dd0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
31de0 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
31df0 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
31e00 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
31e10 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
31e20 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
31e30 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
31e40 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
31e50 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
31e60 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66  */.#include <dlf
31e70 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  cn.h>.static voi
31e80 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71  d *unixDlOpen(sq
31e90 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
31ea0 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
31eb0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e  zFilename){.  UN
31ec0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
31ed0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
31ee0 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
31ef0 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
31f00 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a  TLD_GLOBAL);.}..
31f10 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c  /*.** SQLite cal
31f20 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
31f30 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
31f40 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69  er a call to uni
31f50 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75  xDlSym() or.** u
31f60 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c  nixDlOpen() fail
31f70 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  s (returns a nul
31f80 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61  l pointer). If a
31f90 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65   more detailed e
31fa0 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
31fb0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74  is available, it
31fc0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a   is written to z
31fd0 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72  BufOut. If no er
31fe0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
31ff0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75  s available, zBu
32000 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d  fOut is left unm
32010 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69  odified and SQLi
32020 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c  te uses a defaul
32030 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  t.** error messa
32040 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
32050 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73  id unixDlError(s
32060 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
32070 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
32080 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
32090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
320a0 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
320b0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
320c0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
320d0 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
320e0 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
320f0 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
32100 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
32110 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
32120 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  zErr);.  }.  uni
32130 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
32140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75  .static void (*u
32150 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nixDlSym(sqlite3
32160 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
32170 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  oid *p, const ch
32180 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  ar*zSym))(void){
32190 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20  .  /* .  ** GCC 
321a0 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
321b0 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20  rrors says that 
321c0 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  C90 does not all
321d0 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65  ow a void* to be
321e0 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20  .  ** cast into 
321f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
32200 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65  unction.  And ye
32210 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c  t the library dl
32220 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  sym() routine.  
32230 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69  ** returns a voi
32240 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c  d* which is real
32250 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
32260 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20  a function.  So 
32270 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75  how do we.  ** u
32280 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20  se dlsym() with 
32290 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
322a0 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69  ?.  **.  ** Vari
322b0 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20  able x below is 
322c0 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20  defined to be a 
322d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
322e0 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a  ction taking.  *
322f0 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69  * parameters voi
32300 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61  d* and const cha
32310 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  r* and returning
32320 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
32330 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57  function..  ** W
32340 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62  e initialize x b
32350 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61  y assigning it a
32360 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
32370 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e  dlsym() function
32380 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73  ..  ** (That ass
32390 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73  ignment requires
323a0 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20   a cast.)  Then 
323b0 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63  we call the func
323c0 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78  tion that.  ** x
323d0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20   points to.  .  
323e0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72  **.  ** This wor
323f0 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69  k-around is unli
32400 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72  kely to work cor
32410 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79  rectly on any sy
32420 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20  stem where.  ** 
32430 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f  you really canno
32440 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f  t cast a functio
32450 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76  n pointer into v
32460 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c  oid*.  But then,
32470 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   on the.  ** oth
32480 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29  er hand, dlsym()
32490 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f   will not work o
324a0 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20  n such a system 
324b0 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61  either, so we ha
324c0 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c  ve.  ** not real
324d0 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67  ly lost anything
324e0 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ..  */.  void (*
324f0 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  (*x)(void*,const
32500 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a   char*))(void);.
32510 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32520 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78  ER(NotUsed);.  x
32530 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f   = (void(*(*)(vo
32540 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
32550 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20  )(void))dlsym;. 
32560 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20   return (*x)(p, 
32570 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20  zSym);.}.static 
32580 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65  void unixDlClose
32590 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
325a0 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61  tUsed, void *pHa
325b0 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
325c0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
325d0 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48  d);.  dlclose(pH
325e0 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
325f0 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
32600 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
32610 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
32620 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
32630 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
32640 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a  e unixDlError 0.
32650 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
32660 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
32670 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a  e unixDlClose 0.
32680 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
32690 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
326a0 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f  f random data to
326b0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
326c0 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  ffer zBuf..*/.st
326d0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e  atic int unixRan
326e0 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
326f0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
32700 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
32710 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
32720 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
32730 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65  ;.  assert((size
32740 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66  _t)nBuf>=(sizeof
32750 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28  (time_t)+sizeof(
32760 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65  int)));..  /* We
32770 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
32780 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
32790 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
327a0 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
327b0 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
327c0 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
327d0 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
327e0 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
327f0 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
32800 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
32810 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
32820 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
32830 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
32840 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
32850 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
32860 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
32870 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
32880 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
32890 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
328a0 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
328b0 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
328c0 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
328d0 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
328e0 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
328f0 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
32900 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
32910 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
32920 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
32930 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
32940 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
32950 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
32960 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
32970 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
32980 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
32990 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
329a0 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
329b0 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
329c0 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
329d0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
329e0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
329f0 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73  f);.  randomness
32a00 50 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 20  Pid = getpid(); 
32a10 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
32a20 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
32a30 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b      int fd, got;
32a40 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
32a50 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
32a60 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
32a70 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
32a80 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
32a90 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
32aa0 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
32ab0 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
32ac0 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  f(t));.      mem
32ad0 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
32ae0 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73  (t)], &randomnes
32af0 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e  sPid, sizeof(ran
32b00 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20  domnessPid));.  
32b10 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
32b20 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e  of(t)+sizeof(ran
32b30 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69  domnessPid)<=(si
32b40 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
32b50 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
32b60 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e  (t) + sizeof(ran
32b70 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20  domnessPid);.   
32b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
32b90 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66  { got = osRead(f
32ba0 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
32bb0 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
32bc0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
32bd0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
32be0 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
32bf0 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
32c00 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
32c10 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
32c20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
32c30 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
32c40 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
32c50 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
32c60 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
32c70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
32c80 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
32c90 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
32ca0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
32cb0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
32cc0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
32cd0 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
32ce0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
32cf0 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
32d00 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
32d10 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
32d20 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
32d30 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
32d40 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
32d50 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
32d60 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
32d70 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
32d80 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
32d90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
32da0 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
32db0 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
32dc0 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
32dd0 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
32de0 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
32df0 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
32e00 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
32e10 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
32e20 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
32e30 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
32e40 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
32e50 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32e60 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
32e70 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
32e80 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
32e90 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
32ea0 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
32eb0 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
32ec0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
32ed0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32ee0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
32ef0 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
32f00 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
32f10 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
32f20 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
32f30 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
32f40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32f50 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
32f60 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
32f70 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
32f80 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
32f90 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
32fa0 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
32fb0 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
32fc0 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
32fd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
32fe0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
32ff0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
33000 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
33010 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
33020 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
33030 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
33040 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
33050 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
33060 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
33070 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
33080 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
33090 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
330a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
330b0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
330c0 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
330d0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
330e0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
330f0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
33100 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
33110 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
33120 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
33130 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
33140 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
33150 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
33160 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
33170 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
33180 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
33190 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
331a0 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
331b0 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
331c0 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
331d0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
331e0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
331f0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
33200 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
33210 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
33220 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
33230 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
33240 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
33250 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
33260 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
33270 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
33280 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33290 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
332a0 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
332b0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
332c0 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
332d0 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
332e0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
332f0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
33300 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66  LITE_OK;.#if def
33310 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
33320 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
33330 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
33340 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
33350 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
33360 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
33370 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
33380 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
33390 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
333a0 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
333b0 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
333c0 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
333d0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
333e0 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
333f0 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
33400 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
33410 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
33420 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69  Now;.  if( getti
33430 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
33440 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e  )==0 ){.    *piN
33450 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
33460 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
33470 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
33480 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
33490 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  1000;.  }else{. 
334a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
334b0 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RROR;.  }.#endif
334c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
334d0 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
334e0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
334f0 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
33500 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
33510 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
33520 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
33530 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
33540 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33550 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33570 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
33580 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
33590 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
335a0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
335b0 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
335c0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
335d0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
335e0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
335f0 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
33600 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
33610 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
33620 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
33630 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
33640 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
33650 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
33660 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70  tUsed, double *p
33670 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33  rNow){.  sqlite3
33680 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20  _int64 i = 0;.  
33690 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44  int rc;.  UNUSED
336a0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
336b0 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78  ed);.  rc = unix
336c0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
336d0 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f  (0, &i);.  *prNo
336e0 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
336f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
33700 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64  ../*.** We added
33710 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   the xGetLastErr
33720 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68  or() method with
33730 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f   the intention o
33740 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62  f providing.** b
33750 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20  etter low-level 
33760 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77  error messages w
33770 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79  hen operating-sy
33780 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f  stem problems co
33790 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20  me up.** during 
337a0 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e  SQLite operation
337b0 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e  .  But so far, n
337c0 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20  one of that has 
337d0 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  been implemented
337e0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  .** in the core.
337f0 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
33800 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
33810 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20  d.  For now, it 
33820 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70  is merely.** a p
33830 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a  lace-holder..*/.
33840 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
33850 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
33860 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33870 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
33880 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
33890 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
338a0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
338b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
338c0 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
338d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
338e0 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
338f0 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a  rn 0;.}.../*.***
33900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33910 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c  ***** End of sql
33920 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
33930 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
33940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
33950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
339a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
339f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a00 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50  ******** Begin P
33a10 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  roxy Locking ***
33a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
33a40 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
33a50 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63  g is a "uber-loc
33a60 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20  king-method" in 
33a70 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20  this sense:  It 
33a80 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65  uses the.** othe
33a90 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  r locking method
33aa0 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c  s on secondary l
33ab0 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78  ock files.  Prox
33ac0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a  y locking is a.*
33ad0 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65  * meta-layer ove
33ae0 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69  r top of the pri
33af0 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69  mitive locking i
33b00 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65  mplemented above
33b10 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72  .  For.** this r
33b20 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
33b30 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
33b40 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  nts of proxy loc
33b50 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
33b60 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69  .** until late i
33b70 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65  n the file (here
33b80 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  ) after all of t
33b90 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74  he other I/O met
33ba0 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  hods have.** bee
33bb0 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74  n defined - so t
33bc0 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
33bd0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
33be0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a  s are available.
33bf0 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74  ** as services t
33c00 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20  o help with the 
33c10 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
33c20 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  f proxy locking.
33c30 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  .**.****.**.** T
33c40 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
33c50 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51  ng schemes in SQ
33c60 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61  Lite use byte-ra
33c70 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  nge locks on the
33c80 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
33c90 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  e to coordinate 
33ca0 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  safe, concurrent
33cb0 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
33cc0 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61  ple readers.** a
33cd0 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70  nd writers [http
33ce0 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f  ://sqlite.org/lo
33cf0 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20  ckingv3.html].  
33d00 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f  The five file lo
33d10 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20  cking.** states 
33d20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49  (UNLOCKED, PENDI
33d30 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  NG, SHARED, RESE
33d40 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29  RVED, EXCLUSIVE)
33d50 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
33d60 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61  .** as POSIX rea
33d70 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  d & write locks 
33d80 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f  over fixed set o
33d90 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61  f locations (via
33da0 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41   fsctl),.** on A
33db0 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20  FP and SMB only 
33dc0 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
33dd0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61  ange locks are a
33de0 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63  vailable via fsc
33df0 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52  tl.** with _IOWR
33e00 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
33e10 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
33e20 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  2) to track the 
33e30 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a  same 5 states..*
33e40 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  * To simulate a 
33e50 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73  F_RDLCK on the s
33e60 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20  hared range, on 
33e70 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73  AFP a randomly s
33e80 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65  elected.** addre
33e90 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  ss in the shared
33ea0 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
33eb0 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63  for a SHARED loc
33ec0 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  k, the entire.**
33ed0 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
33ee0 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58   taken for an EX
33ef0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a  CLUSIVE lock):.*
33f00 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e  *.**      PENDIN
33f10 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78  G_BYTE        0x
33f20 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20  40000000.**     
33f30 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
33f40 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
33f50 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
33f60 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
33f70 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
33f80 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
33f90 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
33fa0 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
33fb0 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
33fc0 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
33fd0 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
33fe0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
33ff0 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
34000 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
34010 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
34020 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
34030 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
34040 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
34050 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
34060 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
34070 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
34080 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
34090 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
340a0 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
340b0 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
340c0 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
340d0 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
340e0 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
340f0 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
34100 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
34110 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
34120 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
34130 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
34140 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
34150 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
34160 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
34170 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
34180 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
34190 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
341a0 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
341b0 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
341c0 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
341d0 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
341e0 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
341f0 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
34200 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
34210 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
34220 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
34230 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
34240 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
34250 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
34260 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
34270 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
34280 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
34290 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
342a0 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
342b0 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
342c0 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
342d0 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
342e0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
342f0 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
34300 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
34310 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
34320 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
34330 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
34340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
34350 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
34360 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
34370 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
34380 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
34390 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
343a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343b0 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74        <proxy_pat
343c0 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  h> | ":auto:");.
343d0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
343e0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
343f0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f  ame, SQLITE_GET_
34400 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26  LOCKPROXYFILE, &
34410 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
34420 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
34430 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
34440 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
34450 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
34460 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
34470 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
34480 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
34490 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
344a0 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
344b0 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
344c0 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
344d0 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
344e0 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
344f0 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
34500 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
34510 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
34520 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
34530 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
34540 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
34550 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
34560 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
34570 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
34580 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
34590 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
345a0 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
345b0 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
345c0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
345d0 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
345e0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
345f0 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
34600 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
34610 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
34620 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
34630 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
34640 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
34650 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
34660 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
34670 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
34680 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
34690 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
346a0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
346b0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
346c0 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
346d0 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
346e0 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
346f0 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
34700 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
34710 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
34720 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
34730 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
34740 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
34750 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
34760 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
34770 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
34780 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
34790 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
347a0 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
347b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
347c0 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
347d0 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
347e0 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
347f0 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
34800 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
34810 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
34820 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
34830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34840 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
34850 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
34860 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
34870 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
34880 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
34890 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
348a0 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
348b0 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
348c0 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
348d0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
348e0 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
348f0 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
34900 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
34910 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
34920 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
34930 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
34940 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
34950 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
34960 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
34970 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
34980 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
34990 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
349a0 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
349b0 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
349c0 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
349d0 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
349e0 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
349f0 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
34a00 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
34a10 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
34a20 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
34a30 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
34a40 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
34a50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34a60 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
34a70 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
34a80 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
34a90 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
34aa0 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20 63  exist, or it's c
34ab0 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d  ontents do not m
34ac0 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74  atch the.** host
34ad0 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79   ID and/or proxy
34ae0 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20   path, then the 
34af0 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65  lock is escalate
34b00 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  d to an exclusiv
34b10 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68  e.** lock and th
34b20 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
34b30 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64  tents is updated
34b40 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49   with the host I
34b50 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70  D and proxy.** p
34b60 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ath and the lock
34b70 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74   is downgraded t
34b80 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
34b90 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63  again.  If the c
34ba0 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20  onch.** is held 
34bb0 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  by another proce
34bc0 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65  ss (with a share
34bd0 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63  d lock), the exc
34be0 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77  lusive lock.** w
34bf0 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c  ill fail and SQL
34c00 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
34c10 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
34c20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73  proxy file - a s
34c30 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20  ingle-byte file 
34c40 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76  used for all adv
34c50 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73  isory file locks
34c60 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b  .** normally tak
34c70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
34c80 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20  se file.   This 
34c90 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20  allows for safe 
34ca0 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  sharing.** of th
34cb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34cc0 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61  for multiple rea
34cd0 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
34ce0 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
34cf0 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20  host (the conch 
34d00 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
34d10 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61  y all use the sa
34d20 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  me local lock fi
34d30 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65  le)..**.** Reque
34d40 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70  sting the lock p
34d50 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d  roxy does not im
34d60 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74  mediately take t
34d70 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a  he conch, it is.
34d80 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68  ** only taken wh
34d90 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71  en the first req
34da0 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74  uest to lock dat
34db0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61  abase file is ma
34dc0 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61  de.  .** This ma
34dd0 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74  tches the semant
34de0 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69  ics of the tradi
34df0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62  tional locking b
34e00 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a  ehavior, where.*
34e10 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e  * opening a conn
34e20 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
34e30 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e  base file does n
34e40 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f  ot take a lock o
34e50 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61  n it..** The sha
34e60 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20  red lock and an 
34e70 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
34e80 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69  ptor are maintai
34e90 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68  ned until .** th
34ea0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
34eb0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
34ec0 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  closed. .**.** T
34ed0 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e  he proxy file an
34ee0 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  d the lock file 
34ef0 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65  are never delete
34f00 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e  d so they only n
34f10 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65  eed.** to be cre
34f20 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74  ated the first t
34f30 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65  ime they are use
34f40 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  d..**.** Configu
34f50 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a  ration options.*
34f60 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
34f70 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53  -------.**.**  S
34f80 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
34f90 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a  XY_LOCKING.**.**
34fa0 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20         Database 
34fb0 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f  files accessed o
34fc0 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65  n non-local file
34fd0 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20   systems are.** 
34fe0 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61        automatica
34ff0 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66  lly configured f
35000 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
35010 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65  , lock files are
35020 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20  .**       named 
35030 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73  automatically us
35040 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67  ing the same log
35050 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50  ic as.**       P
35060 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79  RAGMA lock_proxy
35070 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a  _file=":auto:".*
35080 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45  *    .**  SQLITE
35090 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a  _PROXY_DEBUG.**.
350a0 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73  **       Enables
350b0 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20   the logging of 
350c0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64  error messages d
350d0 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69  uring host id fi
350e0 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72  le.**       retr
350f0 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69  ieval and creati
35100 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52  on.**.**  LOCKPR
35110 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20  OXYDIR.**.**    
35120 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65     Overrides the
35130 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f   default directo
35140 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
35150 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61   proxy files tha
35160 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e  t.**       are n
35170 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
35180 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74  ly via the ":aut
35190 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a  o:" setting.**.*
351a0 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  *  SQLITE_DEFAUL
351b0 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
351c0 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20  SSIONS.**.**    
351d0 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74     Permissions t
351e0 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
351f0 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20  ing a directory 
35200 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a  for storing the.
35210 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72  **       lock pr
35220 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20  oxy files, only 
35230 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52  used when LOCKPR
35240 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65  OXYDIR is not se
35250 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20  t..**    .**    
35260 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64  .** As mentioned
35270 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d   above, when com
35280 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
35290 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
352a0 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69  OCKING,.** setti
352b0 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  ng the environme
352c0 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49  nt variable SQLI
352d0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
352e0 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c  OCKING to 1 will
352f0 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20  .** force proxy 
35300 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73  locking to be us
35310 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  ed for every dat
35320 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65  abase file opene
35330 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c  d, and 0.** will
35340 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63   force automatic
35350 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
35360 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f  o be disabled fo
35370 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
35380 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69  * files (explici
35390 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ty calling the S
353a0 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
353b0 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f  OXYFILE pragma o
353c0 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65  r.** sqlite_file
353d0 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20  _control API is 
353e0 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79 20  not affected by 
353f0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
35400 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a  XY_LOCKING)..*/.
35410 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  ./*.** Proxy loc
35420 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
35430 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
35440 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64   .*/.#if defined
35450 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
35460 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
35470 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a  KING_STYLE../*.*
35480 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69  * The proxyLocki
35490 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68  ngContext has th
354a0 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20  e path and file 
354b0 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
354c0 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e  he remote .** an
354d0 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69  d local proxy fi
354e0 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70  les in it.*/.typ
354f0 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f 78  edef struct prox
35500 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
35510 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35520 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78  ext;.struct prox
35530 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
35540 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  {.  unixFile *co
35550 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
35560 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66   /* Open conch f
35570 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ile */.  char *c
35580 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20  onchFilePath;   
35590 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
355a0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
355b0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  */.  unixFile *l
355c0 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20  ockProxy;       
355d0 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20    /* Open proxy 
355e0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63  lock file */.  c
355f0 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61  har *lockProxyPa
35600 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
35610 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79  ame of the proxy
35620 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
35630 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
35640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35650 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
35660 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63   file */.  int c
35670 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20  onchHeld;       
35680 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20          /* 1 if 
35690 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c  the conch is hel
356a0 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73  d, -1 if lockles
356b0 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
356c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
356d0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
356e0 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
356f0 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
35700 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
35710 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
35720 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
35730 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
35740 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
35750 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
35760 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
35770 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
35780 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
35790 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
357a0 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
357b0 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
357c0 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
357d0 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
357e0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
357f0 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
35800 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
35810 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
35820 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
35830 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
35840 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
35850 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
35860 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
35870 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
35880 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
35890 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
358a0 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
358b0 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
358c0 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
358d0 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
358e0 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
358f0 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
35900 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
35910 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
35920 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
35930 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
35940 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
35950 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
35960 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
35970 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
35980 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
35990 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
359a0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
359b0 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  }.    len = strl
359c0 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69  cat(lPath, "sqli
359d0 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65  teplocks", maxLe
359e0 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c  n);    .  }.# el
359f0 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  se.  len = strlc
35a00 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f  py(lPath, "/tmp/
35a10 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e  ", maxLen);.# en
35a20 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  dif.#endif..  if
35a30 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d  ( lPath[len-1]!=
35a40 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d  '/' ){.    len =
35a50 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
35a60 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  "/", maxLen);.  
35a70 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66  }.  .  /* transf
35a80 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68 20  orm the db path 
35a90 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63 68  to a unique cach
35aa0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65  e name */.  dbLe
35ab0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
35ac0 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20  dbPath);.  for( 
35ad0 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20  i=0; i<dbLen && 
35ae0 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d  (i+len+7)<(int)m
35af0 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  axLen; i++){.   
35b00 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74 68   char c = dbPath
35b10 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69  [i];.    lPath[i
35b20 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29  +len] = (c=='/')
35b30 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50  ?'_':c;.  }.  lP
35b40 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b  ath[i+len]='\0';
35b50 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68  .  strlcat(lPath
35b60 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c  , ":auto:", maxL
35b70 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  en);.  OSTRACE((
35b80 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72  "GETLOCKPATH  pr
35b90 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
35ba0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74   pid=%d\n", lPat
35bb0 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
35bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
35bd0 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72  K;.}../* . ** Cr
35be0 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66  eates the lock f
35bf0 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73  ile and any miss
35c00 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20  ing directories 
35c10 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a  in lockPath. */.
35c20 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
35c30 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63  CreateLockPath(c
35c40 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50  onst char *lockP
35c50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c  ath){.  int i, l
35c60 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d  en;.  char buf[M
35c70 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e  AXPATHLEN];.  in
35c80 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a  t start = 0;.  .
35c90 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74    assert(lockPat
35ca0 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74  h!=NULL);.  /* t
35cb0 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c  ry to create all
35cc0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
35cd0 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f  e directories */
35ce0 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  .  len = (int)st
35cf0 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a  rlen(lockPath);.
35d00 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50    buf[0] = lockP
35d10 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69  ath[0];.  for( i
35d20 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29  =1; i<len; i++ )
35d30 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61  {.    if( lockPa
35d40 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20  th[i] == '/' && 
35d50 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20  (i - start > 0) 
35d60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79  ){.      /* only
35d70 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64   mkdir if leaf d
35d80 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22  ir != "." or "/"
35d90 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20   or ".." */.    
35da0 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20    if( i-start>2 
35db0 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26  || (i-start==1 &
35dc0 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
35dd0 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
35de0 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20  ] != '/') .     
35df0 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d      || (i-start=
35e00 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =2 && buf[start]
35e10 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
35e20 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20  tart+1] != '.') 
35e30 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69  ){.        buf[i
35e40 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  ]='\0';.        
35e50 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c  if( osMkdir(buf,
35e60 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
35e70 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
35e80 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20  IONS) ){.       
35e90 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
35ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
35eb0 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a  err!=EEXIST ) {.
35ec0 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52              OSTR
35ed0 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
35ee0 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65  PATH  FAILED cre
35ef0 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20  ating %s, ".    
35f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f10 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63   "'%s' proxy loc
35f20 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
35f30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
35f40 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73            buf, s
35f50 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f  trerror(err), lo
35f60 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
35f70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
35f80 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20  return err;.    
35f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35fa0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
35fb0 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d  start=i+1;.    }
35fc0 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f  .    buf[i] = lo
35fd0 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20  ckPath[i];.  }. 
35fe0 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
35ff0 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  ELOCKPATH  proxy
36000 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
36010 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74  d=%d\n", lockPat
36020 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  h, getpid()));. 
36030 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
36040 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
36050 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69   VFS file descri
36060 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20  ptor (stored in 
36070 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
36080 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  from.** sqlite3_
36090 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e  malloc) and open
360a0 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20   the file named 
360b0 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69  "path" in the fi
360c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
360d0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
360e0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e  is responsible n
360f0 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73  ot only for clos
36100 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73  ing the file des
36110 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61  criptor.** but a
36120 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20  lso for freeing 
36130 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  the memory assoc
36140 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
36150 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
36160 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
36170 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c  oxyCreateUnixFil
36180 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e(.    const cha
36190 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20  r *path,        
361a0 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20  /* path for the 
361b0 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a  new unixFile */.
361c0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70      unixFile **p
361d0 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20  pFile,       /* 
361e0 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64  unixFile created
361f0 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79   and returned by
36200 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20   ref */.    int 
36210 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20  islockfile      
36220 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a       /* if non z
36230 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73  ero missing dirs
36240 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
36250 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64   */.) {.  int fd
36260 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c   = -1;.  unixFil
36270 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  e *pNew;.  int r
36280 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36290 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
362a0 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
362b0 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  T;.  sqlite3_vfs
362c0 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74   dummyVfs;.  int
362d0 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55   terrno = 0;.  U
362e0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
362f0 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  used = NULL;..  
36300 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20  /* 1. first try 
36310 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
36320 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20  he file.  ** 2. 
36330 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61  if that fails, a
36340 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63  nd this is a loc
36350 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63  k file (not-conc
36360 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67  h), try creating
36370 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74  .  ** the parent
36380 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64   directories and
36390 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e   then try again.
363a0 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74  .  ** 3. if that
363b0 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f   fails, try to o
363c0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61  pen the file rea
363d0 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  d-only.  ** othe
363e0 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53  rwise return BUS
363f0 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29  Y (if lock file)
36400 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72   or CANTOPEN for
36410 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a   the conch file.
36420 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d    */.  pUnused =
36430 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
36440 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29  path, openFlags)
36450 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20  ;.  if( pUnused 
36460 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75  ){.    fd = pUnu
36470 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65  sed->fd;.  }else
36480 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  {.    pUnused = 
36490 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
364a0 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
364b0 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73  ;.    if( !pUnus
364c0 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
364d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
364e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
364f0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20   fd<0 ){.    fd 
36500 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
36510 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30  th, openFlags, 0
36520 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20  );.    terrno = 
36530 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66  errno;.    if( f
36540 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  d<0 && errno==EN
36550 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69  OENT && islockfi
36560 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
36570 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50  proxyCreateLockP
36580 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c  ath(path) == SQL
36590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
365a0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
365b0 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
365c0 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  gs, 0);.      }.
365d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
365e0 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  fd<0 ){.    open
365f0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59  Flags = O_RDONLY
36600 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
36610 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65  t_open(path, ope
36620 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  nFlags, 0);.    
36630 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  terrno = errno;.
36640 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
36650 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b  {.    if( islock
36660 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65  file ){.      re
36670 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
36680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
36690 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20  ch (terrno) {.  
366a0 20 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a      case EACCES:
366b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
366c0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
366d0 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20     case EIO: .  
366e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
366f0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20  ITE_IOERR_LOCK; 
36700 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  /* even though i
36710 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a  t is the conch *
36720 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  /.      default:
36730 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
36740 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
36750 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
36760 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69    .  pNew = (uni
36770 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f  xFile *)sqlite3_
36780 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
36790 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  New));.  if( pNe
367a0 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72  w==NULL ){.    r
367b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
367c0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63  ;.    goto end_c
367d0 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d  reate_proxy;.  }
367e0 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
367f0 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
36800 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  le));.  pNew->op
36810 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
36820 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ags;.  memset(&d
36830 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65  ummyVfs, 0, size
36840 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20  of(dummyVfs));. 
36850 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61   dummyVfs.pAppDa
36860 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74  ta = (void*)&aut
36870 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20  olockIoFinder;. 
36880 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20   dummyVfs.zName 
36890 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e  = "dummy";.  pUn
368a0 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  used->fd = fd;. 
368b0 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20   pUnused->flags 
368c0 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70  = openFlags;.  p
368d0 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  New->pUnused = p
368e0 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20  Unused;.  .  rc 
368f0 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
36900 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20  (&dummyVfs, fd, 
36910 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
36920 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20  New, path, 0);. 
36930 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36940 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c  OK ){.    *ppFil
36950 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65  e = pNew;.    re
36960 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
36970 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70    }.end_create_p
36980 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75  roxy:    .  robu
36990 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66  st_close(pNew, f
369a0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
369b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
369c0 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  w);.  sqlite3_fr
369d0 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72  ee(pUnused);.  r
369e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
369f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
36a00 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
36a10 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
36a20 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
36a30 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
36a40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68  */.int sqlite3_h
36a50 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23  ostid_num = 0;.#
36a60 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50  endif..#define P
36a70 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20  ROXY_HOSTIDLEN  
36a80 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66    16  /* conch f
36a90 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67  ile host id leng
36aa0 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c  th */../* Not al
36ab0 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20  ways defined in 
36ac0 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69  the headers as i
36ad0 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f  t ought to be */
36ae0 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68  .extern int geth
36af0 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69  ostuuid(uuid_t i
36b00 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  d, const struct 
36b10 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b  timespec *wait);
36b20 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73  ../* get the hos
36b30 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74  t ID via gethost
36b40 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20  uuid(), pHostID 
36b50 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52  must point to PR
36b60 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a  OXY_HOSTIDLEN .*
36b70 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61  * bytes of writa
36b80 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ble memory..*/.s
36b90 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
36ba0 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65  etHostID(unsigne
36bb0 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c  d char *pHostID,
36bc0 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20   int *pError){. 
36bd0 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f   assert(PROXY_HO
36be0 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f  STIDLEN == sizeo
36bf0 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65  f(uuid_t));.  me
36c00 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c  mset(pHostID, 0,
36c10 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
36c20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  );.#if defined(_
36c30 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAX_OS_X_VERSIO
36c40 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 5c  N_MIN_REQUIRED)\
36c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36c60 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45  && __MAC_OS_X_VE
36c70 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52  RSION_MIN_REQUIR
36c80 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20 20  ED<1050.  {.    
36c90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
36ca0 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d  uct timespec tim
36cb0 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f  eout = {1, 0}; /
36cc0 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20  * 1 sec timeout 
36cd0 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f  */.    if( getho
36ce0 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20  stuuid(pHostID, 
36cf0 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20  &timeout) ){.   
36d00 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
36d10 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  no;.      if( pE
36d20 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
36d30 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20  *pError = err;. 
36d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
36d50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
36d60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
36d70 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
36d80 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65  ETER(pError);.#e
36d90 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
36da0 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d  TE_TEST.  /* sim
36db0 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
36dc0 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
36dd0 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
36de0 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69  ile paths */.  i
36df0 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  f( sqlite3_hosti
36e00 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20  d_num != 0){.   
36e10 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63   pHostID[0] = (c
36e20 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20  har)(pHostID[0] 
36e30 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33  + (char)(sqlite3
36e40 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78  _hostid_num & 0x
36e50 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  FF));.  }.#endif
36e60 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  .  .  return SQL
36e70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
36e80 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
36e90 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72  tains the header
36ea0 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f  , host id and lo
36eb0 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f  ck file path. */
36ec0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43  .#define PROXY_C
36ed0 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20  ONCHVERSION 2   
36ee0 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72  /* 1-byte header
36ef0 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69  , 16-byte host i
36f00 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69  d, path */.#defi
36f10 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  ne PROXY_HEADERL
36f20 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e  EN    1   /* con
36f30 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c  ch file header l
36f40 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65  ength */.#define
36f50 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
36f60 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45      (PROXY_HEADE
36f70 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
36f80 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52  DLEN).#define PR
36f90 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20  OXY_MAXCONCHLEN 
36fa0 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
36fb0 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
36fc0 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f  N+MAXPATHLEN)../
36fd0 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f  * .** Takes an o
36fe0 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  pen conch file, 
36ff0 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65  copies the conte
37000 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74  nts to a new pat
37010 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73  h and then moves
37020 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54   .** it back.  T
37030 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64  he newly created
37040 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73   file's file des
37050 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67  criptor is assig
37060 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  ned to the.** co
37070 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75  nch file structu
37080 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74  re and finally t
37090 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63  he original conc
370a0 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
370b0 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e  r is .** closed.
370c0 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69    Returns zero i
370d0 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
370e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
370f0 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
37100 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
37110 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
37120 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
37130 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
37140 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
37150 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
37160 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
37170 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
37180 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
37190 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20  nchFile;.  char 
371a0 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  tPath[MAXPATHLEN
371b0 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52  ];.  char buf[PR
371c0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
371d0 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20  ;.  char *cPath 
371e0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
371f0 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20  ePath;.  size_t 
37200 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73  readLen = 0;.  s
37210 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20  ize_t pathLen = 
37220 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67  0;.  char errmsg
37230 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74  [64] = "";.  int
37240 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20   fd = -1;.  int 
37250 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45  rc = -1;.  UNUSE
37260 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f  D_PARAMETER(myHo
37270 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65  stID);..  /* cre
37280 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62  ate a new path b
37290 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72  y replace the tr
372a0 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20  ailing '-conch' 
372b0 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f  with '-break' */
372c0 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72  .  pathLen = str
372d0 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74  lcpy(tPath, cPat
372e0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
372f0 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41    if( pathLen>MA
37300 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68  XPATHLEN || path
37310 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28  Len<6 || .     (
37320 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70  strlcpy(&tPath[p
37330 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61  athLen-5], "brea
37340 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a  k", 6) != 5) ){.
37350 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
37360 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
37370 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68  sg),errmsg,"path
37380 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
37390 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a  ,(int)pathLen);.
373a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
373b0 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
373c0 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20   read the conch 
373d0 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61  content */.  rea
373e0 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63  dLen = osPread(c
373f0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66  onchFile->h, buf
37400 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
37410 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  LEN, 0);.  if( r
37420 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54  eadLen<PROXY_PAT
37430 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71  HINDEX ){.    sq
37440 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
37450 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72  izeof(errmsg),er
37460 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72  rmsg,"read error
37470 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29   (len %d)",(int)
37480 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  readLen);.    go
37490 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
374a0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65  ;.  }.  /* write
374b0 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74   it out to the t
374c0 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66  emporary break f
374d0 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f  ile */.  fd = ro
374e0 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c  bust_open(tPath,
374f0 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54   (O_RDWR|O_CREAT
37500 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20  |O_EXCL), 0);.  
37510 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
37520 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
37530 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
37540 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65   errmsg, "create
37550 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
37560 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
37570 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
37580 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74   }.  if( osPwrit
37590 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c  e(fd, buf, readL
375a0 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65  en, 0) != (ssize
375b0 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20  _t)readLen ){.  
375c0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
375d0 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
375e0 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74  ), errmsg, "writ
375f0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
37600 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
37610 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
37620 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65    }.  if( rename
37630 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29  (tPath, cPath) )
37640 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
37650 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
37660 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
37670 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25  rename failed (%
37680 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
37690 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
376a0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ock;.  }.  rc = 
376b0 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  0;.  fprintf(std
376c0 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c  err, "broke stal
376d0 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c  e lock on %s\n",
376e0 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73   cPath);.  robus
376f0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63  t_close(pFile, c
37700 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  onchFile->h, __L
37710 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46  INE__);.  conchF
37720 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63  ile->h = fd;.  c
37730 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
37740 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
37750 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65  _CREAT;..end_bre
37760 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63  aklock:.  if( rc
37770 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d   ){.    if( fd>=
37780 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  0 ){.      osUnl
37790 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20  ink(tPath);.    
377a0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
377b0 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  File, fd, __LINE
377c0 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  __);.    }.    f
377d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
377e0 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20  failed to break 
377f0 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73  stale lock on %s
37800 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20  , %s\n", cPath, 
37810 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72  errmsg);.  }.  r
37820 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
37830 54 61 6b 65 20 74 68 65 20 72 65 71 75 65 73 74  Take the request
37840 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
37850 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72  onch file and br
37860 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b  eak a stale lock
37870 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
37880 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a   id matches..*/.
37890 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
378a0 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69  ConchLock(unixFi
378b0 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f  le *pFile, uuid_
378c0 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20  t myHostID, int 
378d0 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f  lockType){.  pro
378e0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
378f0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
37900 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
37910 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
37920 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
37930 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
37940 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
37950 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37960 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72  TE_OK;.  int nTr
37970 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  ies = 0;.  struc
37980 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68  t timespec conch
37990 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65  ModTime;.  .  me
379a0 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69  mset(&conchModTi
379b0 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f  me, 0, sizeof(co
379c0 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20  nchModTime));.  
379d0 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f  do {.    rc = co
379e0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
379f0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
37a00 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
37a10 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
37a20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20   nTries ++;.    
37a30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
37a40 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  USY ){.      /* 
37a50 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  If the lock fail
37a60 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20  ed (busy):.     
37a70 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74    * 1st try: get
37a80 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66   the mod time of
37a90 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74   the conch, wait
37aa0 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67   0.5s and try ag
37ab0 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32  ain. .       * 2
37ac0 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20  nd try: fail if 
37ad0 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61  the mod time cha
37ae0 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20  nged or host id 
37af0 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61  is different, wa
37b00 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20  it .       *    
37b10 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61 6e         10 sec an
37b20 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20  d try again.    
37b30 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72     * 3rd try: br
37b40 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c  eak the lock unl
37b50 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  ess the mod time
37b60 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20   has changed..  
37b70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
37b80 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
37b90 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
37ba0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26  (conchFile->h, &
37bb0 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  buf) ){.        
37bc0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
37bd0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
37be0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37bf0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
37c00 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
37c10 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29   if( nTries==1 )
37c20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d  {.        conchM
37c30 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f  odTime = buf.st_
37c40 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20  mtimespec;.     
37c50 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30     usleep(500000
37c60 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73  ); /* wait 0.5 s
37c70 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c  ec and try the l
37c80 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20  ock again*/.    
37c90 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
37ca0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
37cb0 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20  ssert( nTries>1 
37cc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e  );.      if( con
37cd0 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63  chModTime.tv_sec
37ce0 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
37cf0 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a  spec.tv_sec || .
37d00 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f           conchMo
37d10 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d  dTime.tv_nsec !=
37d20 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
37d30 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20  c.tv_nsec ){.   
37d40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
37d50 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d  TE_BUSY;.      }
37d60 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
37d70 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20  ( nTries==2 ){  
37d80 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42  .        char tB
37d90 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
37da0 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69  HLEN];.        i
37db0 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64  nt len = osPread
37dc0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74  (conchFile->h, t
37dd0 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  Buf, PROXY_MAXCO
37de0 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20  NCHLEN, 0);.    
37df0 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b      if( len<0 ){
37e00 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
37e10 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
37e20 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
37e30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
37e40 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
37e50 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
37e60 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en>PROXY_PATHIND
37e70 45 58 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28  EX && tBuf[0]==(
37e80 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48  char)PROXY_CONCH
37e90 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20  VERSION){.      
37ea0 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65      /* don't bre
37eb0 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74  ak the lock if t
37ec0 68 65 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e  he host id doesn
37ed0 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  't match */.    
37ee0 20 20 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d        if( 0!=mem
37ef0 63 6d 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f  cmp(&tBuf[PROXY_
37f00 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f  HEADERLEN], myHo
37f10 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54  stID, PROXY_HOST
37f20 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20  IDLEN) ){.      
37f30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
37f40 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
37f50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
37f60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
37f70 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
37f80 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20  e lock on short 
37f90 72 65 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f  read or a versio
37fa0 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20  n mismatch */.  
37fb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
37fc0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
37fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73      }.        us
37fe0 6c 65 65 70 28 31 30 30 30 30 30 30 30 29 3b 20  leep(10000000); 
37ff0 2f 2a 20 77 61 69 74 20 31 30 20 73 65 63 20 61  /* wait 10 sec a
38000 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
38010 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
38020 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20   continue; .    
38030 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
38040 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d   assert( nTries=
38050 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =3 );.      if( 
38060 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e  0==proxyBreakCon
38070 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79  chLock(pFile, my
38080 48 6f 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20  HostID) ){.     
38090 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
380a0 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  K;.        if( l
380b0 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49  ockType==EXCLUSI
380c0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
380d0 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
380e0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
380f0 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
38100 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48  e*)conchFile, SH
38110 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20  ARED_LOCK);     
38120 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
38130 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20          if( !rc 
38140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
38150 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
38160 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
38170 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
38180 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
38190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
381a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69   }.    }.  } whi
381b0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
381c0 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20  USY && nTries<3 
381d0 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  );.  .  return r
381e0 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74  c;.}../* Takes t
381f0 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69  he conch by taki
38200 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
38210 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f   and read the co
38220 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66  ntents conch, if
38230 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73   .** lockPath is
38240 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68   non-NULL, the h
38250 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20  ost ID and lock 
38260 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d  file path must m
38270 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a  atch.  A NULL .*
38280 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73  * lockPath means
38290 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61   that the lockPa
382a0 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
382b0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
382c0 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73  d if the .** hos
382d0 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20  t IDs match, or 
382e0 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20  a new lock path 
382f0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
38300 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
38310 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20  .** and written 
38320 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  to the conch fil
38330 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
38340 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
38350 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
38360 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
38370 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
38380 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
38390 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
383a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
383b0 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f   .  if( pCtx->co
383c0 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20  nchHeld!=0 ){.  
383d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
383e0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
383f0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
38400 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
38410 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64  chFile;.    uuid
38420 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20  _t myHostID;.   
38430 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b   int pError = 0;
38440 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75  .    char readBu
38450 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
38460 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c  LEN];.    char l
38470 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  ockPath[MAXPATHL
38480 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74  EN];.    char *t
38490 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55  empLockPath = NU
384a0 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  LL;.    int rc =
384b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
384c0 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20  int createConch 
384d0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73  = 0;.    int hos
384e0 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20  tIdMatch = 0;.  
384f0 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20    int readLen = 
38500 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c  0;.    int tryOl
38510 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
38520 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c     int forceNewL
38530 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
38540 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22   .    OSTRACE(("
38550 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f  TAKECONCH  %d fo
38560 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
38570 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
38580 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78             (pCtx
38590 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lock