/ Hex Artifact Content
Login

Artifact 2c6a5a60cd4009863bb56bcb12a60d48c63e27b60809989dc4f5f71ef88e1a7f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
0de0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  # include <sys/p
0df0: 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  aram.h>.#endif /
0e00: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0e10: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
0e20: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0e30: 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f  APPLE__) && ((__
0e40: 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
0e50: 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20  _MIN_REQUIRED > 
0e60: 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20  1050) || \.     
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f        (__IPHONE_
0e90: 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  OS_VERSION_MIN_R
0ea0: 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29  EQUIRED > 2000))
0eb0: 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65 64  .#  if (!defined
0ec0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0ed0: 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54 5f  DED) || (TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29 29  OS_EMBEDDED==0))
0ef0: 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21 64   \.       && (!d
0f00: 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49 50  efined(TARGET_IP
0f10: 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29 20  HONE_SIMULATOR) 
0f20: 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f 4e  || (TARGET_IPHON
0f30: 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29 29  E_SIMULATOR==0))
0f40: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41 56  .#    define HAV
0f50: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
0f60: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61 72  #  else.#    war
0f70: 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75 69  ning "gethostuui
0f80: 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2e  d() is disabled.
0f90: 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ".#  endif.#endi
0fa0: 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  f...#if OS_VXWOR
0fb0: 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  KS.# include <sy
0fc0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63  s/ioctl.h>.# inc
0fd0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c 69  h>.# include <li
0ff0: 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  mits.h>.#endif /
1000: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1010: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1020: 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
1030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1040: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1050: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1060: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41  endif..#ifdef HA
1070: 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75  VE_UTIME.# inclu
1080: 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e  de <utime.h>.#en
1090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
10a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
10b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
10c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
10d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
10e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
10f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1100: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1110: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1120: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1130: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1140: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1150: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1160: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1170: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1180: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1190: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
11a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
11b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
11c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
11d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
11e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1200: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1210: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1220: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1230: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1240: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
1250: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1260: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1270: 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65  xy dir.*/.#ifnde
1280: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1290: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
12a0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
12b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
12c0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
12d0: 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a  NS 0755.#endif..
12e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75  /*.** Maximum su
12f0: 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e  pported path-len
1300: 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  gth..*/.#define 
1310: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
1320: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
1330: 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f 6c  supported symbol
1340: 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65 66  ic links.*/.#def
1350: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ine SQLITE_MAX_S
1360: 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a 20  YMLINKS 100../* 
1370: 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65 20  Always cast the 
1380: 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e 20  getpid() return 
1390: 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  type for compati
13a0: 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b  bility with.** k
13b0: 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e  ernel modules in
13c0: 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65   VxWorks. */.#de
13d0: 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29  fine osGetpid(X)
13e0: 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28 29   (pid_t)getpid()
13f0: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
1400: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
1410: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
1420: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
1430: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
1440: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
1450: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
1460: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
1470: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
1480: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
1490: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
14a0: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
14b0: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
14c0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
14d0: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
14e0: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e  truct unixShm un
14f0: 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  ixShm;          
1500: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1510: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1520: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1530: 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75  ct unixShmNode u
1540: 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20  nixShmNode;     
1550: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1560: 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74  ry instance */.t
1570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1580: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78  ixInodeInfo unix
1590: 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20  InodeInfo;   /* 
15a0: 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70  An i-node */.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78  edef struct Unix
15c0: 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75  UnusedFd UnixUnu
15d0: 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e  sedFd;     /* An
15e0: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
15f0: 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a  criptor */../*.*
1600: 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74  * Sometimes, aft
1610: 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65  er a file handle
1620: 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51   is closed by SQ
1630: 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64  Lite, the file d
1640: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e  escriptor.** can
1650: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
1660: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68  mediately. In th
1670: 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61  ese cases, insta
1680: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
1690: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
16a0: 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  re are used to s
16b0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65  tore the file de
16c0: 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77  scriptor while w
16d0: 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a  aiting for an.**
16e0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
16f0: 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20  either close or 
1700: 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72  reuse it..*/.str
1710: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1720: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1740: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1750: 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  r to close */.  
1760: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
1770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1780: 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73  gs this file des
1790: 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e  criptor was open
17a0: 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69  ed with */.  Uni
17b0: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
17c0: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
17d0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
17e0: 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69  iptor on same fi
17f0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1800: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
1810: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
1820: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1830: 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  le specific to t
1840: 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69  he unix.** VFS i
1850: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
1860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1870: 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46  t unixFile unixF
1880: 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78  ile;.struct unix
1890: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
18a0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
18b0: 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20  t *pMethod;  /* 
18c0: 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  Always the first
18d0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
18e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20  /* The VFS that 
1910: 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69  created this uni
1920: 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49  xFile */.  unixI
1930: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1950: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1960: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1970: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19b0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
19c0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19e0: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
19f0: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1a00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  .  unsigned shor
1a10: 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b  t int ctrlFlags;
1a20: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1a30: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1a40: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1a50: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1a80: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1a90: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1aa0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1ab0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1ac0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1ad0: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1ae0: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1af0: 75 73 65 64 46 64 20 2a 70 50 72 65 61 6c 6c 6f  usedFd *pPreallo
1b00: 63 61 74 65 64 55 6e 75 73 65 64 3b 20 20 2f 2a  catedUnused;  /*
1b10: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1b20: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1b40: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1b50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b60: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1b70: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ba0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1bb0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1bc0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1bf0: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1c00: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1c10: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1c20: 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b    int nFetchOut;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c50: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  of outstanding x
1c60: 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20  Fetch refs */.  
1c70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1c80: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
1c90: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
1ca0: 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74  ze of mapping at
1cb0: 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20   pMapRegion */. 
1cc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1cd0: 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20  mapSizeActual;  
1ce0: 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73       /* Actual s
1cf0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1d00: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1d10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d20: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
1d30: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1d40: 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  red FCNTL_MMAP_S
1d50: 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76  IZE value */.  v
1d60: 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b  oid *pMapRegion;
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
1d90: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65  ped region */.#e
1da0: 6e 64 69 66 0a 20 20 69 6e 74 20 73 65 63 74 6f  ndif.  int secto
1db0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1dd0: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1de0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1df0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1e10: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1e20: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e30: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e40: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e50: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e60: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e80: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e90: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1ea0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1eb0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1ec0: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1ed0: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1ee0: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
1f10: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
1f20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
1f30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1f40: 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 75  ETLK_TIMEOUT.  u
1f50: 6e 73 69 67 6e 65 64 20 69 42 75 73 79 54 69 6d  nsigned iBusyTim
1f60: 65 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  eout;           
1f70: 20 20 20 2f 2a 20 57 61 69 74 20 74 68 69 73 20     /* Wait this 
1f80: 6d 61 6e 79 20 6d 69 6c 6c 69 73 65 63 20 6f 6e  many millisec on
1f90: 20 6c 6f 63 6b 73 20 2a 2f 0a 23 65 6e 64 69 66   locks */.#endif
1fa0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1fb0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1fc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1fd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1fe0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1ff0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2000: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
2010: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
2020: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
2030: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
2040: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
2050: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2060: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
2070: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
2080: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
2090: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
20a0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
20b0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
20c0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
20d0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
20e0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
20f0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
2100: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
2110: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2120: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
2130: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
2140: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
2150: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
2160: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
2170: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
2180: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2190: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
21a0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
21b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
21c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
21d0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
21e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21f0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2200: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2210: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2220: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2230: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2240: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2250: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2260: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2270: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2280: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2290: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
22a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
22b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
22c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
22d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
22e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
22f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2300: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2310: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2320: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2330: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2340: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2350: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2360: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2370: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2380: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2390: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
23a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
23b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
23c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
23d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
23e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
23f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2400: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2410: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2420: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2430: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2440: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2450: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2460: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2470: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2480: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2490: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
24a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
24b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
24c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
24d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
24e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
24f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2500: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2510: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2520: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2530: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2540: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2550: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2560: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2570: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2580: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2590: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
25a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
25b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
25c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
25d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
25e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
25f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2600: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2610: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2620: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2630: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2640: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2650: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2660: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2670: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2680: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2690: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
26a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
26b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
26c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
26d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
26e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
26f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2700: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2710: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2720: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2730: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2740: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2750: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2760: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
2770: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
2780: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
2790: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
27a0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
27b0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
27c0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
27d0: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
27e0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
27f0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2800: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2810: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2820: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2830: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2840: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2850: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2860: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61  ./*.** The threa
2870: 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76  did macro resolv
2880: 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  es to the thread
2890: 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73  -id or to 0.  Us
28a0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
28b0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
28c0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  only..*/.#if SQL
28d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
28e0: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
28f0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
2900: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
2910: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
2920: 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41  /*.** HAVE_MREMA
2930: 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72  P defaults to tr
2940: 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20  ue on Linux and 
2950: 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65  false everywhere
2960: 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64   else..*/.#if !d
2970: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d  efined(HAVE_MREM
2980: 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64  AP).# if defined
2990: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
29a0: 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52  efined(_GNU_SOUR
29b0: 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41  CE).#  define HA
29c0: 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c  VE_MREMAP 1.# el
29d0: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  se.#  define HAV
29e0: 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64  E_MREMAP 0.# end
29f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
2a00: 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c   Explicitly call
2a10: 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72 73   the 64-bit vers
2a20: 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f  ion of lseek() o
2a30: 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72  n Android. Other
2a40: 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a  wise, lseek().**
2a50: 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20 76   is the 32-bit v
2a60: 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20  ersion, even if 
2a70: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
2a80: 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e  S=64 is defined.
2a90: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  .*/.#ifdef __AND
2aa0: 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20  ROID__.# define 
2ab0: 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65  lseek lseek64.#e
2ac0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f 6c  ndif..#ifdef __l
2ad0: 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 4c 69 6e  inux__./*.** Lin
2ae0: 75 78 2d 73 70 65 63 69 66 69 63 20 49 4f 43 54  ux-specific IOCT
2af0: 4c 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 20  L magic numbers 
2b00: 75 73 65 64 20 66 6f 72 20 63 6f 6e 74 72 6f 6c  used for control
2b10: 6c 69 6e 67 20 46 32 46 53 0a 2a 2f 0a 23 64 65  ling F2FS.*/.#de
2b20: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 54 4c 5f  fine F2FS_IOCTL_
2b30: 4d 41 47 49 43 20 20 20 20 20 20 20 20 30 78 66  MAGIC        0xf
2b40: 35 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49  5.#define F2FS_I
2b50: 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49 43 5f  OC_START_ATOMIC_
2b60: 57 52 49 54 45 20 20 20 20 20 5f 49 4f 28 46 32  WRITE     _IO(F2
2b70: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20  FS_IOCTL_MAGIC, 
2b80: 31 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f  1).#define F2FS_
2b90: 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  IOC_COMMIT_ATOMI
2ba0: 43 5f 57 52 49 54 45 20 20 20 20 5f 49 4f 28 46  C_WRITE    _IO(F
2bb0: 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c  2FS_IOCTL_MAGIC,
2bc0: 20 32 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53   2).#define F2FS
2bd0: 5f 49 4f 43 5f 53 54 41 52 54 5f 56 4f 4c 41 54  _IOC_START_VOLAT
2be0: 49 4c 45 5f 57 52 49 54 45 20 20 20 5f 49 4f 28  ILE_WRITE   _IO(
2bf0: 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43  F2FS_IOCTL_MAGIC
2c00: 2c 20 33 29 0a 23 64 65 66 69 6e 65 20 46 32 46  , 3).#define F2F
2c10: 53 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41  S_IOC_ABORT_VOLA
2c20: 54 49 4c 45 5f 57 52 49 54 45 20 20 20 5f 49 4f  TILE_WRITE   _IO
2c30: 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49  (F2FS_IOCTL_MAGI
2c40: 43 2c 20 35 29 0a 23 64 65 66 69 6e 65 20 46 32  C, 5).#define F2
2c50: 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54 55  FS_IOC_GET_FEATU
2c60: 52 45 53 20 20 20 20 20 20 20 20 20 20 20 5f 49  RES           _I
2c70: 4f 52 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41  OR(F2FS_IOCTL_MA
2c80: 47 49 43 2c 20 31 32 2c 20 75 33 32 29 0a 23 64  GIC, 12, u32).#d
2c90: 65 66 69 6e 65 20 46 32 46 53 5f 46 45 41 54 55  efine F2FS_FEATU
2ca0: 52 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  RE_ATOMIC_WRITE 
2cb0: 30 78 30 30 30 34 0a 23 65 6e 64 69 66 20 2f 2a  0x0004.#endif /*
2cc0: 20 5f 5f 6c 69 6e 75 78 5f 5f 20 2a 2f 0a 0a 0a   __linux__ */...
2cd0: 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20  /*.** Different 
2ce0: 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65 63  Unix systems dec
2cf0: 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64  lare open() in d
2d00: 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20  ifferent ways.  
2d10: 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e  Same use.** open
2d20: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2d30: 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72  ,mode_t).  Other
2d40: 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74  s use open(const
2d50: 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e   char*,int,...).
2d60: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2d70: 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ce is important 
2d80: 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69  when using a poi
2d90: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63  nter to the func
2da0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
2db0: 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64 65  safest way to de
2dc0: 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f 62  al with the prob
2dd0: 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73  lem is to always
2de0: 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70 65   use this wrappe
2df0: 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79  r.** which alway
2e00: 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 77  s has the same w
2e10: 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65  ell-defined inte
2e20: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
2e30: 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63   int posixOpen(c
2e40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2e50: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74  , int flags, int
2e60: 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e   mode){.  return
2e70: 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61   open(zFile, fla
2e80: 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a  gs, mode);.}../*
2e90: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
2ea0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
2eb0: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
2ec0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
2ed0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
2ee0: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
2ef0: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
2f00: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2f10: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2f20: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2f30: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2f40: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2f50: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2f60: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2f70: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2f80: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2f90: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2fa0: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2fb0: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2fc0: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2fd0: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2fe0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2ff0: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
3000: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
3010: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
3020: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
3030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3040: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
3050: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3060: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3070: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
3080: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
3090: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
30a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
30b0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
30c0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
30d0: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
30e0: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
30f0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3100: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3110: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
3120: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
3130: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
3140: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
3150: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
3160: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
3170: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
3180: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3190: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
31a0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
31b0: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
31c0: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
31d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
31e0: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
31f0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3200: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
3210: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3220: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
3230: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3240: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
3250: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3260: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
3270: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3280: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
3290: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
32a0: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
32b0: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
32c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
32d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
32e0: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
32f0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3300: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
3310: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3320: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
3330: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3340: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3350: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3360: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
3370: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
3380: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
3390: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
33a0: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
33b0: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
33c0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
33d0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
33e0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
33f0: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
3400: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
3410: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
3420: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
3430: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
3440: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
3450: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
3460: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
3470: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
3480: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3490: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
34a0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
34b0: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
34c0: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
34d0: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
34e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
34f0: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
3500: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3510: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
3520: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
3530: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3540: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
3550: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
3560: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
3570: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3580: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
3590: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
35a0: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
35b0: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
35c0: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
35d0: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
35e0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
35f0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
3600: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3610: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
3620: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
3630: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
3640: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3650: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
3660: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3670: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
3680: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3690: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
36a0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
36b0: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
36c0: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
36d0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
36e0: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
36f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3700: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
3710: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
3720: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3730: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
3740: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3750: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
3760: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3770: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3780: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3790: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
37a0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
37b0: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
37c0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
37d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
37e0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
37f0: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
3800: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
3810: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3820: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
3830: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3840: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3850: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3860: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3870: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3880: 6f 73 50 72 65 61 64 36 34 20 28 28 73 73 69 7a  osPread64 ((ssiz
3890: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
38a0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29  ,size_t,off64_t)
38b0: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
38c0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
38d0: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
38e0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
38f0: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
3900: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
3910: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
3920: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3930: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3940: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3950: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3960: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
3970: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3980: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3990: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
39a0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
39b0: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
39c0: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
39d0: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
39e0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
39f0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3a00: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3a10: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
3a20: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3a30: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
3a40: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a60: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
3a70: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3a80: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3a90: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3aa0: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3ab0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3ac0: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
3ad0: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3ae0: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3af0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3b00: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3b10: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3b20: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3b30: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3b40: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3b50: 66 66 36 34 5f 74 29 29 5c 0a 20 20 20 20 20 20  ff64_t))\.      
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3b70: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3b80: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
3b90: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3ba0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
3bb0: 63 68 6d 6f 64 2c 20 20 20 20 20 20 20 20 20 20  chmod,          
3bc0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3bd0: 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28  Fchmod    ((int(
3be0: 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61  *)(int,mode_t))a
3bf0: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
3c00: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3c10: 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
3c20: 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
3c30: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3c40: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
3c50: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3c60: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f  scall_ptr)posix_
3c70: 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c  fallocate,  0 },
3c80: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c  .#else.  { "fall
3c90: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
3ca0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3cb0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3cc0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
3cd0: 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74  efine osFallocat
3ce0: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
3cf0: 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ff_t,off_t))aSys
3d00: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
3d10: 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22  t)..  { "unlink"
3d20: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3d30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c  _syscall_ptr)unl
3d40: 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30  ink,           0
3d50: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e   },.#define osUn
3d60: 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29  link    ((int(*)
3d70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3d80: 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72  yscall[16].pCurr
3d90: 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44  ent)..  { "openD
3da0: 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73  irectory",    (s
3db0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3dc0: 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  tr)openDirectory
3dd0: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  ,      0 },.#def
3de0: 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  ine osOpenDirect
3df0: 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e  ory ((int(*)(con
3e00: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61  st char*,int*))a
3e10: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
3e20: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64 69  rent)..  { "mkdi
3e30: 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  r",        (sqli
3e40: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3e50: 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20 20  mkdir,          
3e60: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3e70: 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74 28  Mkdir     ((int(
3e80: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 6d  *)(const char*,m
3e90: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
3ea0: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  18].pCurrent).. 
3eb0: 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20 20   { "rmdir",     
3ec0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3ed0: 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20 20  all_ptr)rmdir,  
3ee0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3ef0: 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20 20  efine osRmdir   
3f00: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3f10: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
3f20: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
3f30: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3f40: 5f 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 66 63  _FCHOWN).  { "fc
3f50: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3f60: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3f70: 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20 20  r)fchown,       
3f80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3f90: 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20 20  { "fchown",     
3fa0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3fb0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3fc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3fd0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  dif.#define osFc
3fe0: 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29  hown    ((int(*)
3ff0: 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74  (int,uid_t,gid_t
4000: 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70  ))aSyscall[20].p
4010: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4020: 66 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57  fined(HAVE_FCHOW
4030: 4e 29 0a 20 20 7b 20 22 67 65 74 65 75 69 64 22  N).  { "geteuid"
4040: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
4050: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 65  syscall_ptr)gete
4060: 75 69 64 2c 20 20 20 20 20 20 20 20 20 30 20 7d  uid,         0 }
4070: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 67 65 74  ,.#else.  { "get
4080: 65 75 69 64 22 2c 20 20 20 20 20 20 28 73 71 6c  euid",      (sql
4090: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
40a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
40b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
40c0: 65 66 69 6e 65 20 6f 73 47 65 74 65 75 69 64 20  efine osGeteuid 
40d0: 20 20 28 28 75 69 64 5f 74 28 2a 29 28 76 6f 69    ((uid_t(*)(voi
40e0: 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e  d))aSyscall[21].
40f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4100: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4110: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
4120: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
4130: 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  >0.  { "mmap",  
4140: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
4150: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70  syscall_ptr)mmap
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
4170: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 6d 61  ,.#else.  { "mma
4180: 70 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  p",         (sql
4190: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
41a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
41c0: 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76  efine osMmap ((v
41d0: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
41e0: 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74  ze_t,int,int,int
41f0: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
4200: 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [22].pCurrent)..
4210: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4220: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
4230: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
4240: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 75 6e  _SIZE>0.  { "mun
4250: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
4260: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4270: 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  )munmap,        
4280: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4290: 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20   "munmap",      
42a0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
42b0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
42c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
42d0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6e  if.#define osMun
42e0: 6d 61 70 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  map ((int(*)(voi
42f0: 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  d*,size_t))aSysc
4300: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
4310: 29 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  )..#if HAVE_MREM
4320: 41 50 20 26 26 20 28 21 64 65 66 69 6e 65 64 28  AP && (!defined(
4330: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
4340: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
4350: 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20  MAP_SIZE>0).  { 
4360: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
4370: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4380: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
4390: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
43a0: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
43b0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
43c0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
43d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
43e0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
43f0: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
4400: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
4410: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
4420: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
4430: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
4440: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4450: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
4460: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
4470: 20 20 7b 20 22 67 65 74 70 61 67 65 73 69 7a 65    { "getpagesize
4480: 22 2c 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73  ",  (sqlite3_sys
4490: 63 61 6c 6c 5f 70 74 72 29 75 6e 69 78 47 65 74  call_ptr)unixGet
44a0: 70 61 67 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23  pagesize, 0 },.#
44b0: 65 6c 73 65 0a 20 20 7b 20 22 67 65 74 70 61 67  else.  { "getpag
44c0: 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65  esize",  (sqlite
44d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
44f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
4500: 6e 65 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ne osGetpagesize
4510: 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29   ((int(*)(void))
4520: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
4530: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4540: 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e  ned(HAVE_READLIN
4550: 4b 29 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b  K).  { "readlink
4560: 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ",     (sqlite3_
4570: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
4580: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 30 20 7d  link,        0 }
4590: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 72 65 61  ,.#else.  { "rea
45a0: 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c  dlink",     (sql
45b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
45c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
45d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
45e0: 65 66 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b  efine osReadlink
45f0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f   ((ssize_t(*)(co
4600: 6e 73 74 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c  nst char*,char*,
4610: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
4620: 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [26].pCurrent)..
4630: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
4640: 5f 4c 53 54 41 54 29 0a 20 20 7b 20 22 6c 73 74  _LSTAT).  { "lst
4650: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
4660: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4670: 72 29 6c 73 74 61 74 2c 20 20 20 20 20 20 20 20  r)lstat,        
4680: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4690: 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20   "lstat",       
46a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
46b0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
46c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
46d0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4c 73 74  if.#define osLst
46e0: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
46f0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
4700: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
4710: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
4720: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
4730: 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66  _linux__) && def
4740: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
4750: 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f  LE_BATCH_ATOMIC_
4760: 57 52 49 54 45 29 0a 20 20 7b 20 22 69 6f 63 74  WRITE).  { "ioct
4770: 6c 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  l",         (sql
4780: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4790: 29 69 6f 63 74 6c 2c 20 20 20 20 20 20 20 20 20  )ioctl,         
47a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
47b0: 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20 20  "ioctl",        
47c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
47d0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
47e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
47f0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 49 6f 63 74  f.#define osIoct
4800: 6c 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69  l ((int(*)(int,i
4810: 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  nt,...))aSyscall
4820: 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [28].pCurrent)..
4830: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
4840: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
4850: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a  stem calls */...
4860: 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79  /*.** On some sy
4870: 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20  stems, calls to 
4880: 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72  fchown() will tr
4890: 69 67 67 65 72 20 61 20 6d 65 73 73 61 67 65 20  igger a message 
48a0: 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a 2a  in a security.**
48b0: 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f 6d   log if they com
48c0: 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20  e from non-root 
48d0: 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20 61  processes.  So a
48e0: 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63 68  void calling fch
48f0: 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20 61  own() if.** we a
4900: 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61  re not running a
4910: 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  s root..*/.stati
4920: 63 20 69 6e 74 20 72 6f 62 75 73 74 46 63 68 6f  c int robustFcho
4930: 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74  wn(int fd, uid_t
4940: 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29   uid, gid_t gid)
4950: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  {.#if defined(HA
4960: 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20 72 65 74  VE_FCHOWN).  ret
4970: 75 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29 20  urn osGeteuid() 
4980: 3f 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28 66  ? 0 : osFchown(f
4990: 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6c 73  d,uid,gid);.#els
49a0: 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e.  return 0;.#e
49b0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
49c0: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
49d0: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
49e0: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
49f0: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
4a00: 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e  ** "unix" VFSes.
4a10: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4a20: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
4a30: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
4a40: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
4a50: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
4a60: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
4a70: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
4a80: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
4a90: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
4aa0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
4ab0: 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d  nt unixSetSystem
4ac0: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
4ad0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
4ae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
4af0: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
4b00: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
4b10: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
4b20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4b30: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
4b40: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
4b50: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
4b60: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
4b70: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
4b80: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
4b90: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
4ba0: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
4bb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
4bc0: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
4bd0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
4be0: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
4bf0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
4c00: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
4c10: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
4c20: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
4c30: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
4c40: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
4c50: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
4c60: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
4c70: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
4c80: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
4c90: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
4ca0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
4cb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
4cc0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4cd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
4ce0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4cf0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
4d00: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
4d10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
4d20: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
4d30: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
4d40: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
4d50: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
4d60: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
4d70: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
4d80: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4d90: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4da0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4db0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4dc0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4dd0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4de0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4df0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
4e00: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
4e10: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
4e20: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
4e30: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4e40: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
4e50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
4e60: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
4e70: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
4e80: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
4e90: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4ea0: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
4eb0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
4ec0: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
4ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4ee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
4ef0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4f00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
4f10: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
4f20: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4f30: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
4f40: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
4f50: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
4f60: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
4f70: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
4f80: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
4f90: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
4fa0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
4fb0: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
4fc0: 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53  all_ptr unixGetS
4fd0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4fe0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4ff0: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
5000: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
5010: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
5020: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5030: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
5040: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5050: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
5060: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
5070: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
5080: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
5090: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
50a0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
50b0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
50c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
50d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
50e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
50f0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
5100: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
5110: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
5120: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
5130: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
5140: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
5150: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
5160: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
5170: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
5180: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
5190: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
51a0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
51b0: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
51c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
51d0: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
51e0: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
51f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5200: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
5210: 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  -1;..  UNUSED_PA
5220: 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66  RAMETER(p);.  if
5230: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ( zName ){.    f
5240: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
5250: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b  ize(aSyscall)-1;
5260: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
5270: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
5280: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
5290: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
52a0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b    }.  }.  for(i+
52b0: 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  +; i<ArraySize(a
52c0: 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a  Syscall); i++){.
52d0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
52e0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20  [i].pCurrent!=0 
52f0: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
5300: 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  l[i].zName;.  }.
5310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5320: 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65  *.** Do not acce
5330: 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73 63  pt any file desc
5340: 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61 6e  riptor less than
5350: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e 20   this value, in 
5360: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a  order to avoid.*
5370: 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62 61  * opening databa
5380: 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66 69  se file using fi
5390: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
53a0: 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79  hat are commonly
53b0: 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74   used for .** st
53c0: 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 75  andard input, ou
53d0: 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e  tput, and error.
53e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
53f0: 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f  TE_MINIMUM_FILE_
5400: 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65 66  DESCRIPTOR.# def
5410: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  ine SQLITE_MINIM
5420: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
5430: 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OR 3.#endif../*.
5440: 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29  ** Invoke open()
5450: 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c  .  Do so multipl
5460: 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69  e times, until i
5470: 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64  t either succeed
5480: 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f  s or.** fails fo
5490: 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74  r some reason ot
54a0: 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a  her than EINTR..
54b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
54c0: 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20  e creation mode 
54d0: 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73 65  "m" is 0 then se
54e0: 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61  t it to the defa
54f0: 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74  ult for.** SQLit
5500: 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  e.  The default 
5510: 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  is SQLITE_DEFAUL
5520: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
5530: 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  NS (normally.** 
5540: 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69 65  0644) as modifie
5550: 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 20  d by the system 
5560: 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73 20  umask.  If m is 
5570: 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d  not 0, then.** m
5580: 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72 65  ake the file cre
5590: 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78  ation mode be ex
55a0: 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67  actly m ignoring
55b0: 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a   the umask..**.*
55c0: 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74 65  * The m paramete
55d0: 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65  r will be non-ze
55e0: 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65  ro only when cre
55f0: 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75  ating -wal, -jou
5600: 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68  rnal,.** and -sh
5610: 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61 6e  m files.  We wan
5620: 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f  t those files to
5630: 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a 20   have *exactly* 
5640: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d  the same.** perm
5650: 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69 72  issions as their
5660: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
5670: 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74 65  se, unadulterate
5680: 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
5690: 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  ** In that way, 
56a0: 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  if a database fi
56b0: 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77 20  le is -rw-rw-rw 
56c0: 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e  or -rw-rw-r-, an
56d0: 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  d a.** transacti
56e0: 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20 6c  on crashes and l
56f0: 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f 74  eaves behind hot
5700: 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
5710: 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74  any.** process t
5720: 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20 77  hat is able to w
5730: 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61  rite to the data
5740: 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62  base will also b
5750: 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63  e able to.** rec
5760: 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f 75  over the hot jou
5770: 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnals..*/.static
5780: 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e   int robust_open
5790: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
57a0: 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29  int f, mode_t m)
57b0: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f  {.  int fd;.  mo
57c0: 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20  de_t m2 = m ? m 
57d0: 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  : SQLITE_DEFAULT
57e0: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
57f0: 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 23  S;.  while(1){.#
5800: 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f  if defined(O_CLO
5810: 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20 6f  EXEC).    fd = o
5820: 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45  sOpen(z,f|O_CLOE
5830: 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20  XEC,m2);.#else. 
5840: 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a     fd = osOpen(z
5850: 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  ,f,m2);.#endif. 
5860: 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
5870: 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d       if( errno==
5880: 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75 65  EINTR ) continue
5890: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
58a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3e     }.    if( fd>
58b0: 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f  =SQLITE_MINIMUM_
58c0: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
58d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43  ) break;.    osC
58e0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73 71  lose(fd);.    sq
58f0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
5900: 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20  _WARNING, .     
5910: 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74 65             "atte
5920: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73  mpt to open \"%s
5930: 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63 72  \" as file descr
5940: 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64  iptor %d", z, fd
5950: 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a  );.    fd = -1;.
5960: 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28 22      if( osOpen("
5970: 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d  /dev/null", f, m
5980: 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  )<0 ) break;.  }
5990: 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a  .  if( fd>=0 ){.
59a0: 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
59b0: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
59c0: 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20 20  t statbuf;.     
59d0: 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64 2c   if( osFstat(fd,
59e0: 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a 20   &statbuf)==0 . 
59f0: 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75 66        && statbuf
5a00: 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20  .st_size==0.    
5a10: 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e 73     && (statbuf.s
5a20: 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d 20  t_mode&0777)!=m 
5a30: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
5a40: 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d    osFchmod(fd, m
5a50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5a60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44 5f  .#if defined(FD_
5a70: 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64 65  CLOEXEC) && (!de
5a80: 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29  fined(O_CLOEXEC)
5a90: 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30   || O_CLOEXEC==0
5aa0: 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64  ).    osFcntl(fd
5ab0: 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e  , F_SETFD, osFcn
5ac0: 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
5ad0: 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
5ae0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
5af0: 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a  eturn fd;.}../*.
5b00: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
5b10: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
5b20: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
5b30: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
5b40: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
5b50: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
5b60: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
5b70: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
5b80: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
5b90: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
5ba0: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
5bb0: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
5bc0: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
5bd0: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
5be0: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
5bf0: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
5c00: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
5c10: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
5c20: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
5c30: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
5c40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5c50: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
5c60: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
5c70: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
5c80: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
5c90: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
5ca0: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
5cb0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
5cc0: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
5cd0: 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ve().*/.static s
5ce0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 75 6e  qlite3_mutex *un
5cf0: 69 78 42 69 67 4c 6f 63 6b 20 3d 20 30 3b 0a 73  ixBigLock = 0;.s
5d00: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45  tatic void unixE
5d10: 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
5d20: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
5d30: 5f 65 6e 74 65 72 28 75 6e 69 78 42 69 67 4c 6f  _enter(unixBigLo
5d40: 63 6b 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ck);.}.static vo
5d50: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
5d60: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
5d70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 75  e3_mutex_leave(u
5d80: 6e 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 23  nixBigLock);.}.#
5d90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5da0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
5db0: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
5dc0: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
5dd0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5de0: 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a  unixBigLock);.}.
5df0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20  #endif...#ifdef 
5e00: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
5e10: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  RACE./*.** Helpe
5e20: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70  r function for p
5e30: 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63  rinting out trac
5e40: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
5e50: 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  om debugging.** 
5e60: 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72  binaries. This r
5e70: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
5e80: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
5e90: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
5ea0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
5eb0: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
5ec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46   const char *azF
5ed0: 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c  ileLock(int eFil
5ee0: 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68  eLock){.  switch
5ef0: 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ( eFileLock ){. 
5f00: 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a     case NO_LOCK:
5f10: 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a   return "NONE";.
5f20: 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f      case SHARED_
5f30: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48  LOCK: return "SH
5f40: 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  ARED";.    case 
5f50: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
5f60: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
5f70: 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49  ;.    case PENDI
5f80: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
5f90: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63  "PENDING";.    c
5fa0: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
5fb0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c  CK: return "EXCL
5fc0: 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65  USIVE";.  }.  re
5fd0: 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a  turn "ERROR";.}.
5fe0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
5ff0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
6000: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
6010: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
6020: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
6030: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
6040: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6050: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
6060: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
6070: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
6080: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
6090: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
60a0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
60b0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
60c0: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
60d0: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
60e0: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
60f0: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
6100: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
6110: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
6120: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
6130: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
6140: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
6150: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
6160: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
6170: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
6180: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
6190: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
61a0: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
61b0: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
61c0: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
61d0: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
61e0: 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63  se{.    s = osFc
61f0: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
6200: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
6210: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e  Printf("fcntl un
6220: 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e  known %d %d %d\n
6230: 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20  ", fd, op, s);. 
6240: 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d     return s;.  }
6250: 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  .  if( p->l_type
6260: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
6270: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
6280: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
6290: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
62a0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
62b0: 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "WRLCK";.  }else
62c0: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
62d0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_UNLCK ){.    z
62e0: 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a  Type = "UNLCK";.
62f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6300: 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20  ert( 0 );.  }.  
6310: 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65  assert( p->l_whe
6320: 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b  nce==SEEK_SET );
6330: 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66  .  s = osFcntl(f
6340: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
6350: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
6360: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
6370: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
6380: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
6390: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
63a0: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
63b0: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
63c0: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
63d0: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
63e0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
63f0: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
6400: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
6410: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
6420: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
6430: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
6440: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
6450: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
6460: 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  *p;.    osFcntl(
6470: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
6480: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
6490: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
64a0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
64b0: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
64c0: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
64d0: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
64e0: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
64f0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
6500: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
6510: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
6520: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
6530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6540: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
6550: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
6560: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
6570: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
6580: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
6590: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
65a0: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
65b0: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
65c0: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
65d0: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
65e0: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
65f0: 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46   s;.}.#undef osF
6600: 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46  cntl.#define osF
6610: 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23  cntl lockTrace.#
6620: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6630: 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LOCK_TRACE */../
6640: 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e  *.** Retry ftrun
6650: 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61  cate() calls tha
6660: 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49  t fail due to EI
6670: 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61  NTR.**.** All ca
6680: 6c 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65  lls to ftruncate
6690: 28 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  () within this f
66a0: 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61  ile should be ma
66b0: 64 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68  de through.** th
66c0: 69 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20  is wrapper.  On 
66d0: 74 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74  the Android plat
66e0: 66 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20  form, bypassing 
66f0: 74 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a  the logic below.
6700: 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  ** could lead to
6710: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
6720: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
6730: 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  nt robust_ftrunc
6740: 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74  ate(int h, sqlit
6750: 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20  e3_int64 sz){.  
6760: 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f  int rc;.#ifdef _
6770: 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20  _ANDROID__.  /* 
6780: 4f 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75  On Android, ftru
6790: 6e 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75  ncate() always u
67a0: 73 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65  ses 32-bit offse
67b0: 74 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a  ts, even if .  *
67c0: 2a 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42  * _FILE_OFFSET_B
67d0: 49 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65  ITS=64 is define
67e0: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74  d. This means it
67f0: 20 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74   is unsafe to at
6800: 74 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72  tempt to.  ** tr
6810: 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
6820: 20 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72   any size larger
6830: 20 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65   than 2GiB. Sile
6840: 6e 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a  ntly ignore any.
6850: 20 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70    ** such attemp
6860: 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a  ts.  */.  if( sz
6870: 3e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  >(sqlite3_int64)
6880: 30 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20  0x7FFFFFFF ){.  
6890: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
68a0: 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
68b0: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74  .  do{ rc = osFt
68c0: 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d  runcate(h,sz); }
68d0: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
68e0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
68f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6900: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6910: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
6920: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
6930: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
6940: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
6950: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
6960: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
6970: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
6980: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
6990: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
69a0: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
69b0: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
69c0: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
69d0: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
69e0: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
69f0: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
6a00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6a10: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
6a20: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
6a30: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
6a40: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
6a50: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
6a60: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
6a70: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
6a80: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
6a90: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
6aa0: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
6ab0: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
6ac0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
6ad0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
6ae0: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
6af0: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
6b00: 72 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20  rr) {.  assert( 
6b10: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6b20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
6b30: 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  K) || .         
6b40: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
6b50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
6b60: 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20  LOCK) || .      
6b70: 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72      (sqliteIOErr
6b80: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
6b90: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20  _RDLOCK) ||.    
6ba0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
6bb0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
6bc0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
6bd0: 4c 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74 63  LOCK) );.  switc
6be0: 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b  h (posixError) {
6bf0: 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20  .  case EACCES: 
6c00: 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a  .  case EAGAIN:.
6c10: 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54    case ETIMEDOUT
6c20: 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a  :.  case EBUSY:.
6c30: 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20    case EINTR:.  
6c40: 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20  case ENOLCK:  . 
6c50: 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53     /* random NFS
6c60: 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e   retry error, un
6c70: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
6c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
6c90: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
6ca0: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
6cb0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
6cc0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
6cd0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
6ce0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20  ITE_BUSY;.    . 
6cf0: 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20   case EPERM: .  
6d00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6d10: 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65 66  PERM;.    .  def
6d20: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
6d30: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
6d40: 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   }.}.../********
6d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d90: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
6da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
6db0: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
6dc0: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
6dd0: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
6de0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ******.**.** On 
6df0: 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66  most versions of
6e00: 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65   unix, we can ge
6e10: 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f  t a unique ID fo
6e20: 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63  r a file by conc
6e30: 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65  atenating.** the
6e40: 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61   device number a
6e50: 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  nd the inode num
6e60: 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64  ber.  But this d
6e70: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
6e80: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56  VxWorks..** On V
6e90: 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65  xWorks, a unique
6ea0: 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65   file id must be
6eb0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61   based on the ca
6ec0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
6ed0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ..**.** A pointe
6ee0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
6ef0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
6f00: 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  g structure can 
6f10: 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  be used as a.** 
6f20: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69  unique file ID i
6f30: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68  n VxWorks.  Each
6f40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
6f50: 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  s structure cont
6f60: 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f  ains.** a copy o
6f70: 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  f the canonical 
6f80: 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65  filename.  There
6f90: 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72   is also a refer
6fa0: 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a  ence count.  .**
6fb0: 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69   The structure i
6fc0: 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e  s reclaimed when
6fd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6fe0: 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72  ointers to it dr
6ff0: 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a  ops to.** zero..
7000: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
7010: 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20  never very many 
7020: 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e  files open at on
7030: 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75  e time and looku
7040: 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20  ps are not.** a 
7050: 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74  performance-crit
7060: 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74  ical path, so it
7070: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
7080: 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73  o put these.** s
7090: 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c  tructures on a l
70a0: 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  inked list..*/.s
70b0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
70c0: 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76  eId {.  struct v
70d0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
70e0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
70f0: 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20   a list of them 
7100: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  all */.  int nRe
7110: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
7120: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7130: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
7140: 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  o this one */.  
7150: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7170: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
7180: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20  CanonicalName[] 
7190: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  string */.  char
71a0: 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65   *zCanonicalName
71b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e  ;         /* Can
71c0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
71d0: 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58  */.};..#if OS_VX
71e0: 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c  WORKS./* .** All
71f0: 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65   unique filename
7200: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20  s are held on a 
7210: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64  linked list head
7220: 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61  ed by this.** va
7230: 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69  riable:.*/.stati
7240: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
7250: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
7260: 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  ileList = 0;../*
7270: 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66  .** Simplify a f
7280: 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73  ilename into its
7290: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a   canonical form.
72a0: 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65  ** by making the
72b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67   following chang
72c0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d  es:.**.**  * rem
72d0: 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69  oving any traili
72e0: 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65  ng and duplicate
72f0: 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74   /.**  * convert
7300: 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f   /./ into just /
7310: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
7320: 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73  A/../ where A is
7330: 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65   any simple name
7340: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a   into just /.**.
7350: 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d  ** Changes are m
7360: 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52  ade in-place.  R
7370: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61  eturn the new na
7380: 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a  me length..**.**
7390: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   The original fi
73a0: 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30  lename is in z[0
73b0: 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20  ..n-1].  Return 
73c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
73d0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
73e0: 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61  he simplified na
73f0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
7400: 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  t vxworksSimplif
7410: 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69  yName(char *z, i
7420: 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nt n){.  int i, 
7430: 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20  j;.  while( n>1 
7440: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
7450: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69  { n--; }.  for(i
7460: 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
7470: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
7480: 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  /' ){.      if( 
7490: 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f  z[i+1]=='/' ) co
74a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
74b0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
74c0: 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+2<n && z[i+2]
74d0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
74e0: 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
74f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7500: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69   }.      if( z[i
7510: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c  +1]=='.' && i+3<
7520: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27  n && z[i+2]=='.'
7530: 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20   && z[i+3]=='/' 
7540: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
7550: 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21  ( j>0 && z[j-1]!
7560: 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
7570: 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29         if( j>0 )
7580: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
7590: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
75a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
75b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
75c0: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a  ++] = z[i];.  }.
75d0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65    z[j] = 0;.  re
75e0: 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn j;.}../*.**
75f0: 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66   Find a unique f
7600: 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67  ile ID for the g
7610: 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  iven absolute pa
7620: 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a  thname.  Return.
7630: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7640: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
7650: 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  d object.  This 
7660: 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75  pointer is the u
7670: 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44  nique.** file ID
7680: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66  ..**.** The nRef
7690: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78   field of the vx
76a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
76b0: 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ct is incremente
76c0: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
76d0: 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e  object is return
76e0: 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72  ed.  A new vxwor
76f0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
7700: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
7710: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67  d added to the g
7720: 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65  lobal list if ne
7730: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
7740: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
7750: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
7760: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  rs, return NULL.
7770: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
7780: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7790: 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65  *vxworksFindFile
77a0: 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Id(const char *z
77b0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20  AbsoluteName){. 
77c0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
77d0: 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20  ileId *pNew;    
77e0: 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b       /* search k
77f0: 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20  ey and new file 
7800: 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ID */.  struct v
7810: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43  xworksFileId *pC
7820: 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46  andidate;   /* F
7830: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
7840: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
7850: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
7880: 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74  ngth of zAbsolut
7890: 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a  eName string */.
78a0: 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f  .  assert( zAbso
78b0: 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  luteName[0]=='/'
78c0: 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73   );.  n = (int)s
78d0: 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e  trlen(zAbsoluteN
78e0: 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ame);.  pNew = s
78f0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
7900: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
7910: 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20   (n+1) );.  if( 
7920: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
7930: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e   0;.  pNew->zCan
7940: 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68  onicalName = (ch
7950: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
7960: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61  memcpy(pNew->zCa
7970: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62  nonicalName, zAb
7980: 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29  soluteName, n+1)
7990: 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53  ;.  n = vxworksS
79a0: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77  implifyName(pNew
79b0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
79c0: 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  , n);..  /* Sear
79d0: 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
79e0: 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  ng entry that ma
79f0: 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e  tching the canon
7a00: 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20  ical name..  ** 
7a10: 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d  If found, increm
7a20: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
7a30: 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75  e count and retu
7a40: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
7a50: 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e    ** the existin
7a60: 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a  g file ID..  */.
7a70: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
7a80: 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69  ();.  for(pCandi
7a90: 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65  date=vxworksFile
7aa0: 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65  List; pCandidate
7ab0: 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61  ; pCandidate=pCa
7ac0: 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b  ndidate->pNext){
7ad0: 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64  .    if( pCandid
7ae0: 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20  ate->nName==n . 
7af0: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43      && memcmp(pC
7b00: 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e  andidate->zCanon
7b10: 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e  icalName, pNew->
7b20: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7b30: 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  n)==0.    ){.   
7b40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7b50: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70  (pNew);.       p
7b60: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b  Candidate->nRef+
7b70: 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65  +;.       unixLe
7b80: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
7b90: 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69     return pCandi
7ba0: 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  date;.    }.  }.
7bb0: 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77  .  /* No match w
7bc0: 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69  as found.  We wi
7bd0: 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69  ll make a new fi
7be0: 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d  le ID */.  pNew-
7bf0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65  >nRef = 1;.  pNe
7c00: 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20  w->nName = n;.  
7c10: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78  pNew->pNext = vx
7c20: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20  worksFileList;. 
7c30: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
7c40: 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c   = pNew;.  unixL
7c50: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
7c60: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
7c70: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
7c80: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
7c90: 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46  nt on a vxworksF
7ca0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46  ileId object.  F
7cb0: 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63  ree.** the objec
7cc0: 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  t when the refer
7cd0: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
7ce0: 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  es zero..*/.stat
7cf0: 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52  ic void vxworksR
7d00: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72  eleaseFileId(str
7d10: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
7d20: 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45  d *pId){.  unixE
7d30: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
7d40: 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66  ssert( pId->nRef
7d50: 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65  >0 );.  pId->nRe
7d60: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e  f--;.  if( pId->
7d70: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nRef==0 ){.    s
7d80: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
7d90: 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f  eId **pp;.    fo
7da0: 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c  r(pp=&vxworksFil
7db0: 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70  eList; *pp && *p
7dc0: 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28  p!=pId; pp = &((
7dd0: 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a  *pp)->pNext)){}.
7de0: 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d      assert( *pp=
7df0: 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20  =pId );.    *pp 
7e00: 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pId->pNext;.  
7e10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7e20: 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Id);.  }.  unixL
7e30: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23  eaveMutex();.}.#
7e40: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
7e50: 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RKS */./********
7e60: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55  ******* End of U
7e70: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
7e80: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
7e90: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
7ea0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
7eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ef0: 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
7f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f40: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
7f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f60: 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73  **** Posix Advis
7f70: 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ory Locking ****
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
7fa0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
7fb0: 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62  cks are broken b
7fc0: 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20  y design.  ANSI 
7fd0: 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36  STD 1003.1 (1996
7fe0: 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35  ).** section 6.5
7ff0: 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74  .2.2 lines 483 t
8000: 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69  hrough 490 speci
8010: 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70  fy that when a p
8020: 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f  rocess.** sets o
8030: 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c  r clears a lock,
8040: 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20   that operation 
8050: 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72  overrides any pr
8060: 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a  ior locks set.**
8070: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
8080: 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e  cess.  It does n
8090: 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61  ot explicitly sa
80a0: 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69  y so, but this i
80b0: 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69  mplies.** that i
80c0: 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b  t overrides lock
80d0: 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d  s set by the sam
80e0: 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20  e process using 
80f0: 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  a different.** f
8100: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
8110: 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74   Consider this t
8120: 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20  est case:.**.** 
8130: 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20        int fd1 = 
8140: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20  open("./file1", 
8150: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
8160: 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20  0644);.**       
8170: 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22  int fd2 = open("
8180: 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52  ./file2", O_RDWR
8190: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
81a0: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e  .**.** Suppose .
81b0: 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c  /file1 and ./fil
81c0: 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68  e2 are really th
81d0: 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63  e same file (bec
81e0: 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61  ause.** one is a
81f0: 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69   hard or symboli
8200: 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74  c link to the ot
8210: 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75  her) then if you
8220: 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75   set.** an exclu
8230: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31  sive lock on fd1
8240: 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65  , then try to ge
8250: 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
8260: 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69  ock.** on fd2, i
8270: 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c  t works.  I woul
8280: 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20  d have expected 
8290: 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20  the second lock 
82a0: 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65  to.** fail since
82b0: 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61   there was alrea
82c0: 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  dy a lock on the
82d0: 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31   file due to fd1
82e0: 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e  ..** But not so.
82f0: 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63    Since both loc
8300: 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65  ks came from the
8310: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74   same process, t
8320: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65  he.** second ove
8330: 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74  rrides the first
8340: 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  , even though th
8350: 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65  ey were on diffe
8360: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
8370: 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
8380: 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  on different fil
8390: 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  e names..**.** T
83a0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77  his means that w
83b0: 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53  e cannot use POS
83c0: 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63  IX locks to sync
83d0: 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63  hronize file acc
83e0: 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d  ess.** among com
83f0: 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f  peting threads o
8400: 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  f the same proce
8410: 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73  ss.  POSIX locks
8420: 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a   will work fine.
8430: 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ** to synchroniz
8440: 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72  e access for thr
8450: 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65  eads in separate
8460: 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20   processes, but 
8470: 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77  not.** threads w
8480: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70  ithin the same p
8490: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  rocess..**.** To
84a0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
84b0: 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65   problem, SQLite
84c0: 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66   has to manage f
84d0: 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e  ile locks intern
84e0: 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f  ally.** on its o
84f0: 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20  wn.  Whenever a 
8500: 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
8510: 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20  opened, we have 
8520: 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73  to find the.** s
8530: 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66  pecific inode of
8540: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8550: 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73  le (the inode is
8560: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
8570: 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64  he.** st_dev and
8580: 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f   st_ino fields o
8590: 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63  f the stat struc
85a0: 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28  ture that fstat(
85b0: 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61  ) fills in).** a
85c0: 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63  nd check for loc
85d0: 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ks already exist
85e0: 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64  ing on that inod
85f0: 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61  e.  When locks a
8600: 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72  re.** created or
8610: 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76   removed, we hav
8620: 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72  e to look at our
8630: 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65   own internal re
8640: 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  cord of the.** l
8650: 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61  ocks to see if a
8660: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
8670: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
8680: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20   a lock on that 
8690: 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a  same.** inode..*
86a0: 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65  *.** (Aside: The
86b0: 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75   use of inode nu
86c0: 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20  mbers as unique 
86d0: 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  IDs does not wor
86e0: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
86f0: 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65   For VxWorks, we
8700: 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65   have to use the
8710: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69   alternative uni
8720: 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61  que ID system ba
8730: 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69  sed on.** canoni
8740: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  cal filename and
8750: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20   implemented in 
8760: 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76  the previous div
8770: 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ision.).**.** Th
8780: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
8790: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
87a0: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
87b0: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
87c0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
87d0: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
87e0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
87f0: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
8800: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
8810: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
8820: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
8830: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
8840: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
8850: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
8860: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
8870: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
8880: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
8890: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
88a0: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
88b0: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
88c0: 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78  twice, both unix
88d0: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a  File structures.
88e0: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ** point to the 
88f0: 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  same locking str
8900: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63  ucture.  The loc
8910: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  king structure k
8920: 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  eeps.** a refere
8930: 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65  nce count (so we
8940: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20   will know when 
8950: 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e  to delete it) an
8960: 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65  d a "cnt".** fie
8970: 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73  ld that tells us
8980: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   its internal lo
8990: 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d  ck status.  cnt=
89a0: 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  =0 means the.** 
89b0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
89c0: 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73  .  cnt==-1 means
89d0: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e   the file has an
89e0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
89f0: 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20  .** cnt>0 means 
8a00: 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68  there are cnt sh
8a10: 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ared locks on th
8a20: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  e file..**.** An
8a30: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63  y attempt to loc
8a40: 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69  k or unlock a fi
8a50: 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20  le first checks 
8a60: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  the locking.** s
8a70: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66  tructure.  The f
8a80: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
8a90: 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b  ll is only invok
8aa0: 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20  ed to set a .** 
8ab0: 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68  POSIX lock if th
8ac0: 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  e internal lock 
8ad0: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69  structure transi
8ae0: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a  tions between.**
8af0: 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e   a locked and an
8b00: 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e   unlocked state.
8b10: 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a  .**.** But wait:
8b20: 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20    there are yet 
8b30: 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69  more problems wi
8b40: 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  th POSIX advisor
8b50: 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49  y locks..**.** I
8b60: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
8b70: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
8b80: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
8b90: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
8ba0: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
8bb0: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
8bc0: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
8bd0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
8be0: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
8bf0: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
8c00: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
8c10: 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64  m, each unixInod
8c20: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20  eInfo object.** 
8c30: 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e  maintains a coun
8c40: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
8c50: 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73  of pending locks
8c60: 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a   on tha inode..*
8c70: 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  * When an attemp
8c80: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f  t is made to clo
8c90: 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20  se an unixFile, 
8ca0: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
8cb0: 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f  other unixFile o
8cc0: 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
8cd0: 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68  inode that are h
8ce0: 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68  olding locks, th
8cf0: 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f  e call.** to clo
8d00: 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65  se() the file de
8d10: 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65  scriptor is defe
8d20: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f  rred until all o
8d30: 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61  f the locks clea
8d40: 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e  r..** The unixIn
8d50: 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  odeInfo structur
8d60: 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f  e keeps a list o
8d70: 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  f file descripto
8d80: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  rs that need to.
8d90: 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ** be closed and
8da0: 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61   that list is wa
8db0: 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65  lked (and cleare
8dc0: 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  d) when the last
8dd0: 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e   lock.** clears.
8de0: 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68  .**.** Yet anoth
8df0: 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e  er problem:  Lin
8e00: 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74  uxThreads do not
8e10: 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20   play well with 
8e20: 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  posix locks..**.
8e30: 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65  ** Many older ve
8e40: 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20  rsions of linux 
8e50: 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72  use the LinuxThr
8e60: 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69  eads library whi
8e70: 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73  ch is.** not pos
8e80: 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55  ix compliant.  U
8e90: 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64  nder LinuxThread
8ea0: 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  s, a lock create
8eb0: 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41  d by thread.** A
8ec0: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66   cannot be modif
8ed0: 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65  ied or overridde
8ee0: 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74  n by a different
8ef0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
8f00: 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ly thread A can 
8f10: 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e  modify the lock.
8f20: 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69    Locking behavi
8f30: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a  or is correct.**
8f40: 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69   if the appliati
8f50: 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65  on uses the newe
8f60: 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54  r Native Posix T
8f70: 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e  hread Library (N
8f80: 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78  PTL).** on linux
8f90: 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c   - with NPTL a l
8fa0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
8fb0: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
8fc0: 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e  ride locks.** in
8fd0: 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20   thread B.  But 
8fe0: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
8ff0: 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69  to know at compi
9000: 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a  le-time which.**
9010: 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61   threading libra
9020: 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ry is being used
9030: 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e  .  So there is n
9040: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
9050: 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  .** compile-time
9060: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
9070: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
9080: 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  rride locks on t
9090: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20  hread B..** One 
90a0: 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d  has to do a run-
90b0: 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69  time check to di
90c0: 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76  scover the behav
90d0: 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75  ior of the.** cu
90e0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a  rrent process..*
90f0: 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64  *.** SQLite used
9100: 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75   to support Linu
9110: 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73  xThreads.  But s
9120: 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78  upport for Linux
9130: 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64  Threads.** was d
9140: 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67  ropped beginning
9150: 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e   with version 3.
9160: 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c  7.0.  SQLite wil
9170: 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74  l still work wit
9180: 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64  h.** LinuxThread
9190: 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20  s provided that 
91a0: 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (1) there is no 
91b0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
91c0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72  nnection .** per
91d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
91e0: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
91f0: 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62  ss and (2) datab
9200: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
9210: 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61  ** do not move a
9220: 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a  cross threads..*
9230: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
9240: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
9250: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
9260: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
9270: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
9280: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
9290: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
92a0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  bject..*/.struct
92b0: 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20   unixFileId {.  
92c0: 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20  dev_t dev;      
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
92e0: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  evice number */.
92f0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
9300: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
9310: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20  ileId *pId;  /* 
9320: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  Unique file ID f
9330: 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23  or vxworks. */.#
9340: 65 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72 65  else.  /* We are
9350: 20 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65 20   told that some 
9360: 76 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64 72  versions of Andr
9370: 6f 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62 75  oid contain a bu
9380: 67 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a 65  g that.  ** size
9390: 73 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79 20  s ino_t at only 
93a0: 33 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64 20  32-bits instead 
93b0: 6f 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65 65  of 64-bits. (See
93c0: 0a 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61 6e  .  ** https://an
93d0: 64 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f 6f  droid-review.goo
93e0: 67 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f  glesource.com/#/
93f0: 63 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74 2f  c/115351/3/dist/
9400: 73 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a 20  sqlite3.c).  ** 
9410: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
9420: 68 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c 6f  his, always allo
9430: 63 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f 72  cate 64-bits for
9440: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
9450: 72 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61  r.  .  ** On sma
9460: 6c 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61 74  ll machines that
9470: 20 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62 69   only have 32-bi
9480: 74 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20 77  t inodes, this w
9490: 61 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a 20  astes 4 bytes,. 
94a0: 20 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68 6f   ** but that sho
94b0: 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69 67  uld not be a big
94c0: 20 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57   deal. */.  /* W
94d0: 41 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  AS:  ino_t ino; 
94e0: 20 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b 20    */.  u64 ino; 
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9500: 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65    /* Inode numbe
9510: 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  r */.#endif.};..
9520: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
9530: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
9540: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
9550: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
9560: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
9570: 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54  .  Or, on LinuxT
9580: 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73  hreads, there is
9590: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74   one of these st
95a0: 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20  ructures for.** 
95b0: 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65  each inode opene
95c0: 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64  d by each thread
95d0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ..**.** A single
95e0: 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20   inode can have 
95f0: 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65  multiple file de
9600: 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61  scriptors, so ea
9610: 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  ch unixFile.** s
9620: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
9630: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
9640: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
9650: 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  is object and th
9660: 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65  is.** object kee
9670: 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ps a count of th
9680: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  e number of unix
9690: 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  File pointing to
96a0: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75   it..*/.struct u
96b0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20  nixInodeInfo {. 
96c0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
96d0: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
96e0: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
96f0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61  ey */.  int nSha
9700: 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  red;            
9710: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9720: 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b  r of SHARED lock
9730: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69  s held */.  unsi
9740: 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c  gned char eFileL
9750: 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  ock;        /* O
9760: 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43  ne of SHARED_LOC
9770: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
9780: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67   etc. */.  unsig
9790: 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73  ned char bProces
97a0: 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e  sLock;     /* An
97b0: 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65   exclusive proce
97c0: 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ss lock is held 
97d0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9800: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
9810: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9820: 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
9830: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  ShmNode;        
9840: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
9850: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
9860: 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  th this inode */
9870: 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20  .  int nLock;   
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
98a0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65  outstanding file
98b0: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78   locks */.  Unix
98c0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
98d0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  d;          /* U
98e0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
98f0: 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20  iptors to close 
9900: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
9910: 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  fo *pNext;      
9920: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
9930: 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  all unixInodeInf
9940: 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75  o objects */.  u
9950: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50  nixInodeInfo *pP
9960: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rev;           /
9970: 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79  *    .... doubly
9980: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53   linked */.#if S
9990: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
99a0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73  KING_STYLE.  uns
99b0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
99c0: 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20  sharedByte;  /* 
99d0: 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65  for AFP simulate
99e0: 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  d shared lock */
99f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
9a00: 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a  XWORKS.  sem_t *
9a10: 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pSem;           
9a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
9a30: 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72  d POSIX semaphor
9a40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d  e */.  char aSem
9a50: 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  Name[MAX_PATHNAM
9a60: 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  E+2];  /* Name o
9a70: 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65  f that semaphore
9a80: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
9a90: 66 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44 5f  f SQLITE_SHARED_
9aa0: 4d 41 50 50 49 4e 47 0a 20 20 73 71 6c 69 74 65  MAPPING.  sqlite
9ab0: 33 5f 69 6e 74 36 34 20 6e 53 68 61 72 65 64 4d  3_int64 nSharedM
9ac0: 61 70 70 69 6e 67 3b 20 20 20 2f 2a 20 53 69 7a  apping;   /* Siz
9ad0: 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69  e of mapped regi
9ae0: 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  on in bytes */. 
9af0: 20 76 6f 69 64 20 2a 70 53 68 61 72 65 64 4d 61   void *pSharedMa
9b00: 70 70 69 6e 67 3b 20 20 20 20 20 20 20 20 20 20  pping;          
9b10: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
9b20: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
9b30: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  if.};../*.** A l
9b40: 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78  ists of all unix
9b50: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
9b60: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69  s..*/.static uni
9b70: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64  xInodeInfo *inod
9b80: 65 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 41  eList = 0;  /* A
9b90: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
9ba0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 73 74 61 74   objects */.stat
9bb0: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
9bc0: 6e 55 6e 75 73 65 64 46 64 20 3d 20 30 3b 20 20  nUnusedFd = 0;  
9bd0: 20 20 2f 2a 20 54 6f 74 61 6c 20 75 6e 75 73 65    /* Total unuse
9be0: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
9bf0: 72 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20  rs */../*.**.** 
9c00: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
9c10: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
9c20: 6e 65 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76  ne(), is only ev
9c30: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
9c40: 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c  e macro.** unixL
9c50: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
9c60: 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61   It is invoked a
9c70: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
9c80: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
9c90: 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f  nction and errno
9ca0: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74   has been.** set
9cb0: 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  . It logs a mess
9cc0: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
9cd0: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
9ce0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
9cf0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f  alue of.** errno
9d00: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
9d10: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
9d20: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
9d30: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
9d40: 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f   or.** strerror_
9d50: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  r()..**.** The f
9d60: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
9d70: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
9d80: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
9d90: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
9da0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
9db0: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
9dc0: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
9dd0: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
9de0: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
9df0: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
9e00: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
9e10: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
9e20: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
9e30: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
9e40: 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c   (e.g. "unlink",
9e50: 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65   "open") and the
9e60: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
9e70: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
9e80: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
9e90: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
9ea0: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
9eb0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
9ec0: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
9ed0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
9ee0: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
9ef0: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f10: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
9f20: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
9f30: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
9f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
9f50: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
9f60: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
9f70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9f80: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
9f90: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
9fa0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
9fb0: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
9fc0: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
9fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
9fe0: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
9ff0: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
a000: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
a010: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a030: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
a040: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
a050: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
a060: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
a070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
a080: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
a090: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
a0a0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
a0b0: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
a0c0: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
a0d0: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
a0e0: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
a0f0: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
a100: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
a110: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
a120: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
a130: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
a140: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
a150: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
a160: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
a170: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
a180: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
a190: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
a1a0: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
a1b0: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
a1c0: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
a1d0: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
a1e0: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
a1f0: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
a200: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
a210: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
a220: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
a230: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
a240: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
a250: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
a260: 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  of strerror_r() 
a270: 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  that.  ** return
a280: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
a290: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
a2a0: 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
a2b0: 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74  sage. That point
a2c0: 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69  er .  ** may poi
a2d0: 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72  nt to aErr[], or
a2e0: 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   it may point to
a2f0: 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f   some static sto
a300: 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20  rage somewhere. 
a310: 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
a320: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
a330: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
a340: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
a350: 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65  on of .  ** stre
a360: 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20  rror_r(), which 
a370: 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e  always writes an
a380: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
a390: 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a  nto aErr[]..  **
a3a0: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64  .  ** If the cod
a3b0: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73  e incorrectly as
a3c0: 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
a3d0: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
a3e0: 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  on that is.  ** 
a3f0: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65  available, the e
a400: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
a410: 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d  l often be an em
a420: 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20  pty string. Not 
a430: 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62  a.  ** huge prob
a440: 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79  lem. Incorrectly
a450: 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74   concluding that
a460: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
a470: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20   is available . 
a480: 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74   ** could lead t
a490: 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f  o a segfault tho
a4a0: 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  ugh..  */.#if de
a4b0: 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52  fined(STRERROR_R
a4c0: 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69  _CHAR_P) || defi
a4d0: 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20  ned(__USE_GNU). 
a4e0: 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66   zErr = .# endif
a4f0: 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45  .  strerror_r(iE
a500: 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65  rrno, aErr, size
a510: 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65  of(aErr)-1);..#e
a520: 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  lif SQLITE_THREA
a530: 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20  DSAFE.  /* This 
a540: 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20  is a threadsafe 
a550: 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72  build, but strer
a560: 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61  ror_r() is not a
a570: 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a  vailable. */.  z
a580: 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a  Err = "";.#else.
a590: 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73    /* Non-threads
a5a0: 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73  afe build, use s
a5b0: 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20  trerror(). */.  
a5c0: 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28  zErr = strerror(
a5d0: 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a  iErrno);.#endif.
a5e0: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
a5f0: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
a600: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
a610: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75  ode,.      "os_u
a620: 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  nix.c:%d: (%d) %
a630: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
a640: 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f     iLine, iErrno
a650: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
a660: 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zErr.  );..  ret
a670: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
a680: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
a690: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
a6a0: 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74  *.** We assume t
a6b0: 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f  hat close() almo
a6c0: 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c  st always works,
a6d0: 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c   since it is onl
a6e0: 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73  y in a.** very s
a6f0: 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ick application 
a700: 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63  or on a very sic
a710: 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20  k platform that 
a720: 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a  it might fail..*
a730: 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69  * If it does fai
a740: 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74  l, simply leak t
a750: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
a760: 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74  or, but do log t
a770: 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  he.** error..**.
a780: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
a790: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72  is not safe to r
a7a0: 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74  etry close() aft
a7b0: 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74  er EINTR since t
a7c0: 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  he.** file descr
a7d0: 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65  iptor might have
a7e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
a7f0: 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20  used by another 
a800: 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65  thread..** So we
a810: 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20   don't even try 
a820: 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
a830: 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20  an EINTR.  Just 
a840: 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  log the error.**
a850: 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f   and move on..*/
a860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62  .static void rob
a870: 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69  ust_close(unixFi
a880: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68  le *pFile, int h
a890: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
a8a0: 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20   if( osClose(h) 
a8b0: 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  ){.    unixLogEr
a8c0: 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45  rorAtLine(SQLITE
a8d0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63  _IOERR_CLOSE, "c
a8e0: 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20  lose",.         
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
a900: 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61  ile ? pFile->zPa
a910: 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b  th : 0, lineno);
a920: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
a930: 74 20 74 68 65 20 70 46 69 6c 65 2d 3e 6c 61 73  t the pFile->las
a940: 74 45 72 72 6e 6f 2e 20 20 44 6f 20 74 68 69 73  tErrno.  Do this
a950: 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65   in a subroutine
a960: 20 61 73 20 74 68 61 74 20 70 72 6f 76 69 64 65   as that provide
a970: 73 0a 2a 2a 20 61 20 63 6f 6e 76 65 6e 69 65 6e  s.** a convenien
a980: 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  t place to set a
a990: 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   breakpoint..*/.
a9a0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72  static void stor
a9b0: 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e 69 78 46  eLastErrno(unixF
a9c0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
a9d0: 65 72 72 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d  error){.  pFile-
a9e0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
a9f0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  or;.}../*.** Clo
aa00: 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63  se all file desc
aa10: 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74  riptors accumuat
aa20: 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e  ed in the unixIn
aa30: 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64  odeInfo->pUnused
aa40: 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69   list..*/ .stati
aa50: 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64  c void closePend
aa60: 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20  ingFds(unixFile 
aa70: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
aa80: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
aa90: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
aaa0: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
aab0: 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65   *p;.  UnixUnuse
aac0: 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  dFd *pNext;.  fo
aad0: 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  r(p=pInode->pUnu
aae0: 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  sed; p; p=pNext)
aaf0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
ab00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75  >pNext;.    robu
ab10: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
ab20: 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p->fd, __LINE__)
ab30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
ab40: 65 65 28 70 29 3b 0a 20 20 20 20 6e 55 6e 75 73  ee(p);.    nUnus
ab50: 65 64 46 64 2d 2d 3b 0a 20 20 7d 0a 20 20 70 49  edFd--;.  }.  pI
ab60: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
ab70: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
ab80: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
ab90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
aba0: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
abb0: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
abc0: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
abd0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
abe0: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
abf0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
ac00: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
ac10: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
ac20: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
ac30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ac40: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
ac50: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
ac60: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
ac70: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
ac80: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
ac90: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
aca0: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41  eld() );.  if( A
acb0: 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b  LWAYS(pInode) ){
acc0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
acd0: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  f--;.    if( pIn
ace0: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
acf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
ad00: 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d  node->pShmNode==
ad10: 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 );.#ifdef SQLI
ad20: 54 45 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e  TE_SHARED_MAPPIN
ad30: 47 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  G.      if( pIno
ad40: 64 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70 69  de->pSharedMappi
ad50: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  ng ){.        os
ad60: 4d 75 6e 6d 61 70 28 70 49 6e 6f 64 65 2d 3e 70  Munmap(pInode->p
ad70: 53 68 61 72 65 64 4d 61 70 70 69 6e 67 2c 20 70  SharedMapping, p
ad80: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 4d 61  Inode->nSharedMa
ad90: 70 70 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  pping);.        
ada0: 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65 64 4d  pInode->pSharedM
adb0: 61 70 70 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  apping = 0;.    
adc0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
add0: 72 65 64 4d 61 70 70 69 6e 67 20 3d 20 30 3b 0a  redMapping = 0;.
ade0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
adf0: 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
ae00: 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
ae10: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70     if( pInode->p
ae20: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
ae30: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
ae40: 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49  pPrev->pNext==pI
ae50: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
ae60: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
ae70: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
ae80: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
ae90: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
aea0: 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49  t( inodeList==pI
aeb0: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
aec0: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f  inodeList = pIno
aed0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
aee0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e   }.      if( pIn
aef0: 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ode->pNext ){.  
af00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
af10: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
af20: 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  ev==pInode );.  
af30: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e        pInode->pN
af40: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ext->pPrev = pIn
af50: 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ode->pPrev;.    
af60: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
af70: 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a  3_free(pInode);.
af80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
af90: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30  rt( inodeList!=0
afa0: 20 7c 7c 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30   || nUnusedFd==0
afb0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   );.}../*.** Giv
afc0: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
afd0: 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65  ptor, locate the
afe0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
aff0: 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65  bject that.** de
b000: 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c  scribes that fil
b010: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
b020: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
b030: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  if necessary.  T
b040: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
b050: 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e  ue might be unin
b060: 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20  itialized if an 
b070: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a  error occurs..**
b080: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
b090: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
b0a0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
b0b0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
b0c0: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
b0d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b0e0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
b0f0: 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  turn an appropri
b100: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
b110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
b120: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75  ndInodeInfo(.  u
b130: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b150: 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20   Unix file with 
b160: 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69  file desc used i
b170: 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75  n the key */.  u
b180: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70  nixInodeInfo **p
b190: 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a  pInode        /*
b1a0: 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78   Return the unix
b1b0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
b1c0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
b1d0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b1f0: 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75  System call retu
b200: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
b210: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
b220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b230: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
b240: 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a  or for pFile */.
b250: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
b260: 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20  eId fileId;     
b270: 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66   /* Lookup key f
b280: 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  or the unixInode
b290: 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74  Info */.  struct
b2a0: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20   stat statbuf;  
b2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d           /* Low-
b2c0: 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72  level file infor
b2d0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78  mation */.  unix
b2e0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
b2f0: 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61  e = 0;     /* Ca
b300: 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64  ndidate unixInod
b310: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a  eInfo object */.
b320: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
b330: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20  utexHeld() );.. 
b340: 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65   /* Get low-leve
b350: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
b360: 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61  out the file tha
b370: 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f  t we can used to
b380: 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75  .  ** create a u
b390: 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74  nique name for t
b3a0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
b3b0: 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
b3c0: 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64   rc = osFstat(fd
b3d0: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69  , &statbuf);.  i
b3e0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
b3f0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
b400: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69  File, errno);.#i
b410: 66 20 64 65 66 69 6e 65 64 28 45 4f 56 45 52 46  f defined(EOVERF
b420: 4c 4f 57 29 20 26 26 20 64 65 66 69 6e 65 64 28  LOW) && defined(
b430: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
b440: 46 53 29 0a 20 20 20 20 69 66 28 20 70 46 69 6c  FS).    if( pFil
b450: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
b460: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
b470: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
b480: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
b490: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
b4a0: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
b4b0: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
b4c0: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
b4d0: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
b4e0: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
b4f0: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
b500: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
b510: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
b520: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
b530: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
b540: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
b550: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
b560: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
b570: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
b580: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
b590: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
b5a0: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
b5b0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
b5c0: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
b5d0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
b5e0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
b5f0: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
b600: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
b610: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
b620: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
b630: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
b640: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
b650: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
b660: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
b670: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
b680: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
b690: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
b6a0: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
b6b0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
b6c0: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
b6d0: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
b6e0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
b6f0: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
b700: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
b710: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
b720: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
b730: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
b740: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
b750: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
b760: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69    do{ rc = osWri
b770: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20  te(fd, "S", 1); 
b780: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
b790: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
b7a0: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
b7b0: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
b7c0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
b7d0: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
b7e0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
b7f0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f      }.    rc = o
b800: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
b810: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
b820: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  !=0 ){.      sto
b830: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
b840: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
b850: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
b860: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
b870: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
b880: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
b890: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
b8a0: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
b8b0: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
b8c0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
b8d0: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
b8e0: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
b8f0: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 28 75 36 34  ileId.ino = (u64
b900: 29 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b  )statbuf.st_ino;
b910: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
b920: 28 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c  ( inodeList!=0 |
b930: 7c 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30 20 29  | nUnusedFd==0 )
b940: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f  ;.  pInode = ino
b950: 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
b960: 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d   pInode && memcm
b970: 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f  p(&fileId, &pIno
b980: 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  de->fileId, size
b990: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
b9a0: 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
b9b0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  de->pNext;.  }. 
b9c0: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
b9d0: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73  {.    pInode = s
b9e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
b9f0: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
ba00: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
ba10: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
ba20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ba30: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
ba40: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
ba50: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
ba60: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
ba70: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
ba80: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
ba90: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
baa0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20   pInode->nRef = 
bab0: 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  1;.    pInode->p
bac0: 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74  Next = inodeList
bad0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50  ;.    pInode->pP
bae0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rev = 0;.    if(
baf0: 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f   inodeList ) ino
bb00: 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  deList->pPrev = 
bb10: 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64  pInode;.    inod
bb20: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a  eList = pInode;.
bb30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
bb40: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ode->nRef++;.  }
bb50: 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49  .  *ppInode = pI
bb60: 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  node;.  return S
bb70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
bb80: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
bb90: 66 20 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e  f pFile has been
bba0: 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69   renamed or unli
bbb0: 6e 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77 61  nked since it wa
bbc0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a  s first opened..
bbd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
bbe0: 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46  leHasMoved(unixF
bbf0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66  ile *pFile){.#if
bc00: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65   OS_VXWORKS.  re
bc10: 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  turn pFile->pIno
bc20: 64 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e  de!=0 && pFile->
bc30: 70 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f  pId!=pFile->pIno
bc40: 64 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a  de->fileId.pId;.
bc50: 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73  #else.  struct s
bc60: 74 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72  tat buf;.  retur
bc70: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
bc80: 3d 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53  =0 &&.      (osS
bc90: 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  tat(pFile->zPath
bca0: 2c 20 26 62 75 66 29 21 3d 30 20 0a 20 20 20 20  , &buf)!=0 .    
bcb0: 20 20 20 20 20 7c 7c 20 28 75 36 34 29 62 75 66       || (u64)buf
bcc0: 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e  .st_ino!=pFile->
bcd0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
bce0: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  no);.#endif.}...
bcf0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e  /*.** Check a un
bd00: 69 78 46 69 6c 65 20 74 68 61 74 20 69 73 20 61  ixFile that is a
bd10: 20 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69   database.  Veri
bd20: 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  fy the following
bd30: 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72  :.**.** (1) Ther
bd40: 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
bd50: 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68   hard link on th
bd60: 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68  e file.** (2) Th
bd70: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  e file is not a 
bd80: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a  symbolic link.**
bd90: 20 28 33 29 20 54 68 65 20 66 69 6c 65 20 68 61   (3) The file ha
bda0: 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d  s not been renam
bdb0: 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a  ed or unlinked.*
bdc0: 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74  *.** Issue sqlit
bdd0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
bde0: 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61  RNING,...) messa
bdf0: 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ges if anything 
be00: 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f  is not right..*/
be10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72  .static void ver
be20: 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69  ifyDbFile(unixFi
be30: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74  le *pFile){.  st
be40: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
be50: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
be60: 68 65 73 65 20 76 65 72 69 66 69 63 61 74 69 6f  hese verificatio
be70: 6e 73 20 6f 63 63 75 72 73 20 66 6f 72 20 74 68  ns occurs for th
be80: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
be90: 6f 6e 6c 79 20 2a 2f 0a 20 20 69 66 28 20 70 46  only */.  if( pF
bea0: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
beb0: 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
bec0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63   ) return;..  rc
bed0: 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65   = osFstat(pFile
bee0: 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66  ->h, &buf);.  if
bef0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc!=0 ){.    s
bf00: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
bf10: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e  E_WARNING, "cann
bf20: 6f 74 20 66 73 74 61 74 20 64 62 20 66 69 6c 65  ot fstat db file
bf30: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
bf40: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  th);.    return;
bf50: 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73  .  }.  if( buf.s
bf60: 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20  t_nlink==0 ){.  
bf70: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
bf80: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
bf90: 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69  ile unlinked whi
bfa0: 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46  le open: %s", pF
bfb0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
bfc0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
bfd0: 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e  f( buf.st_nlink>
bfe0: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
bff0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
c000: 49 4e 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c  ING, "multiple l
c010: 69 6e 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73  inks to file: %s
c020: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
c030: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
c040: 7d 0a 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d  }.  if( fileHasM
c050: 6f 76 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20  oved(pFile) ){. 
c060: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
c070: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
c080: 66 69 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69  file renamed whi
c090: 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46  le open: %s", pF
c0a0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
c0b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a   return;.  }.}..
c0c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c0d0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
c0e0: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
c0f0: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
c100: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
c110: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
c120: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
c130: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
c140: 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
c150: 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
c160: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
c170: 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
c180: 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
c190: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
c1a0: 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
c1b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
c1c0: 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
c1d0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
c1e0: 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
c1f0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68  tatic int unixCh
c200: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
c210: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
c220: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
c230: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c240: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
c250: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
c260: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
c270: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
c280: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
c290: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
c2a0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
c2b0: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
c2c0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
c2d0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
c2e0: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52  >eFileLock<=SHAR
c2f0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 75 6e 69  ED_LOCK );.  uni
c300: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
c310: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
c320: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
c330: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
c340: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
c350: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
c360: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
c370: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
c380: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
c390: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
c3a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
c3b0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
c3c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
c3d0: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
c3e0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
c3f0: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
c400: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
c410: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
c420: 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  && !pFile->pInod
c430: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
c440: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
c450: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
c460: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
c470: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
c480: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
c490: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
c4a0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
c4b0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c4c0: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_WRLCK;.    if(
c4d0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
c4e0: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
c4f0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  k) ){.      rc =
c500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
c510: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
c520: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
c530: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
c540: 6e 6f 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  no);.    } else 
c550: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
c560: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
c570: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
c580: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
c590: 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
c5a0: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
c5b0: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
c5c0: 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29   %d %d %d (unix)
c5d0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
c5e0: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
c5f0: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
c600: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
c610: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
c620: 20 61 20 70 6f 73 69 78 2d 61 64 76 69 73 6f 72   a posix-advisor
c630: 79 2d 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  y-lock..**.** Th
c640: 65 72 65 20 61 72 65 20 74 77 6f 20 76 65 72 73  ere are two vers
c650: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 72 6f 75  ions of this rou
c660: 74 69 6e 65 2e 20 20 49 66 20 63 6f 6d 70 69 6c  tine.  If compil
c670: 65 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54  ed with.** SQLIT
c680: 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54  E_ENABLE_SETLK_T
c690: 49 4d 45 4f 55 54 20 74 68 65 6e 20 74 68 65 20  IMEOUT then the 
c6a0: 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6e 20 65  routine has an e
c6b0: 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 0a 2a  xtra parameter.*
c6c0: 2a 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69  * which is a poi
c6d0: 6e 74 65 72 20 74 6f 20 61 20 75 6e 69 78 46 69  nter to a unixFi
c6e0: 6c 65 2e 20 20 49 66 20 74 68 65 20 75 6e 69 78  le.  If the unix
c6f0: 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65 6f  File->iBusyTimeo
c700: 75 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 73  ut.** value is s
c710: 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  et, then it is t
c720: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
c730: 6c 69 73 65 63 6f 6e 64 73 20 74 6f 20 77 61 69  liseconds to wai
c740: 74 20 62 65 66 6f 72 65 0a 2a 2a 20 66 61 69 6c  t before.** fail
c750: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e 20 20 54  ing the lock.  T
c760: 68 65 20 69 42 75 73 79 54 69 6d 65 6f 75 74 20  he iBusyTimeout 
c770: 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20  value is always 
c780: 72 65 73 65 74 20 62 61 63 6b 20 74 6f 0a 2a 2a  reset back to.**
c790: 20 7a 65 72 6f 20 6f 6e 20 65 61 63 68 20 63 61   zero on each ca
c7a0: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ll..**.** If SQL
c7b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b  ITE_ENABLE_SETLK
c7c0: 5f 54 49 4d 45 4f 55 54 20 69 73 20 6e 6f 74 20  _TIMEOUT is not 
c7d0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 64 6f  defined, then do
c7e0: 20 61 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a   a non-blocking.
c7f0: 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65  ** attempt to se
c800: 74 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 23  t the lock..*/.#
c810: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
c820: 41 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f  ABLE_SETLK_TIMEO
c830: 55 54 0a 23 20 64 65 66 69 6e 65 20 6f 73 53 65  UT.# define osSe
c840: 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79 4c 6f  tPosixAdvisoryLo
c850: 63 6b 28 68 2c 78 2c 74 29 20 6f 73 46 63 6e 74  ck(h,x,t) osFcnt
c860: 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c 78 29 0a 23  l(h,F_SETLK,x).#
c870: 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20  else.static int 
c880: 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f  osSetPosixAdviso
c890: 72 79 4c 6f 63 6b 28 0a 20 20 69 6e 74 20 68 2c  ryLock(.  int h,
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
c8c0: 72 69 70 74 6f 72 20 6f 6e 20 77 68 69 63 68 20  riptor on which 
c8d0: 74 6f 20 74 61 6b 65 20 74 68 65 20 6c 6f 63 6b  to take the lock
c8e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
c8f0: 63 6b 20 2a 70 4c 6f 63 6b 2c 20 20 2f 2a 20 54  ck *pLock,  /* T
c900: 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  he description o
c910: 66 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  f the lock */.  
c920: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
c930: 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75        /* Structu
c940: 72 65 20 68 6f 6c 64 69 6e 67 20 74 69 6d 65 6f  re holding timeo
c950: 75 74 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ut value */.){. 
c960: 20 69 6e 74 20 72 63 20 3d 20 6f 73 46 63 6e 74   int rc = osFcnt
c970: 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c 70 4c 6f 63  l(h,F_SETLK,pLoc
c980: 6b 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3c  k);.  while( rc<
c990: 30 20 26 26 20 70 46 69 6c 65 2d 3e 69 42 75 73  0 && pFile->iBus
c9a0: 79 54 69 6d 65 6f 75 74 3e 30 20 29 7b 0a 20 20  yTimeout>0 ){.  
c9b0: 20 20 2f 2a 20 4f 6e 20 73 79 73 74 65 6d 73 20    /* On systems 
c9c0: 74 68 61 74 20 73 75 70 70 6f 72 74 20 73 6f 6d  that support som
c9d0: 65 20 6b 69 6e 64 20 6f 66 20 62 6c 6f 63 6b 69  e kind of blocki
c9e0: 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 20 77 69 74  ng file lock wit
c9f0: 68 20 61 20 74 69 6d 65 6f 75 74 2c 0a 20 20 20  h a timeout,.   
ca00: 20 2a 2a 20 6d 61 6b 65 20 61 70 70 72 6f 70 72   ** make appropr
ca10: 69 61 74 65 20 63 68 61 6e 67 65 73 20 68 65 72  iate changes her
ca20: 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 61 74  e to invoke that
ca30: 20 62 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 20 6c   blocking file l
ca40: 6f 63 6b 2e 20 20 4f 6e 0a 20 20 20 20 2a 2a 20  ock.  On.    ** 
ca50: 67 65 6e 65 72 69 63 20 70 6f 73 69 78 2c 20 68  generic posix, h
ca60: 6f 77 65 76 65 72 2c 20 74 68 65 72 65 20 69 73  owever, there is
ca70: 20 6e 6f 20 73 75 63 68 20 41 50 49 2e 20 20 53   no such API.  S
ca80: 6f 20 77 65 20 73 69 6d 70 6c 79 20 74 72 79 20  o we simply try 
ca90: 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  the.    ** lock 
caa0: 6f 6e 63 65 20 65 76 65 72 79 20 6d 69 6c 6c 69  once every milli
cab0: 73 65 63 6f 6e 64 20 75 6e 74 69 6c 20 65 69 74  second until eit
cac0: 68 65 72 20 74 68 65 20 74 69 6d 65 6f 75 74 20  her the timeout 
cad0: 65 78 70 69 72 65 73 2c 20 6f 72 20 75 6e 74 69  expires, or unti
cae0: 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  l.    ** the loc
caf0: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 2e 20 2a  k is obtained. *
cb00: 2f 0a 20 20 20 20 75 73 6c 65 65 70 28 31 30 30  /.    usleep(100
cb10: 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  0);.    rc = osF
cb20: 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c 70  cntl(h,F_SETLK,p
cb30: 4c 6f 63 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65  Lock);.    pFile
cb40: 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 2d 2d  ->iBusyTimeout--
cb50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
cb60: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
cb70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54  QLITE_ENABLE_SET
cb80: 4c 4b 5f 54 49 4d 45 4f 55 54 20 2a 2f 0a 0a 0a  LK_TIMEOUT */...
cb90: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
cba0: 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f   set a system-lo
cbb0: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70  ck on the file p
cbc0: 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  File.  The lock 
cbd0: 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64  is .** described
cbe0: 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   by pLock..**.**
cbf0: 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61   If the pFile wa
cc00: 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72  s opened read/wr
cc10: 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78  ite from unix-ex
cc20: 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c  cl, then the onl
cc30: 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f  y lock.** ever o
cc40: 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78  btained is an ex
cc50: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e  clusive lock, an
cc60: 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64  d it is obtained
cc70: 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a   exactly once.**
cc80: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
cc90: 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65  any lock is atte
cca0: 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73  mpted.  All subs
ccb0: 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f  equent system lo
ccc0: 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  cking.** operati
ccd0: 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70  ons become no-op
cce0: 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72  s.  Locking oper
ccf0: 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70  ations still hap
cd00: 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a  pen internally,.
cd10: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
cd20: 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73  oordinate access
cd30: 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74   between separat
cd40: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
cd50: 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e  ctions.** within
cd60: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62   this process, b
cd70: 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69  ut all of that i
cd80: 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d  s handled in mem
cd90: 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f  ory and the.** o
cda0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
cdb0: 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69  does not partici
cdc0: 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pate..**.** This
cdd0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70   function is a p
cde0: 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66  ass-through to f
cdf0: 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66  cntl(F_SETLK) if
ce00: 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a   pFile is using.
ce10: 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72  ** any VFS other
ce20: 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c   than "unix-excl
ce30: 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73  " or if pFile is
ce40: 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78   opened on "unix
ce50: 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73  -excl".** and is
ce60: 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a   read-only..**.*
ce70: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
ce80: 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63  ed if the call c
ce90: 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73  ompletes success
cea0: 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20  fully, or -1 if 
ceb0: 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e  a call.** to fcn
cec0: 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74  tl() fails. In t
ced0: 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20  his case, errno 
cee0: 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61  is set appropria
cef0: 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29  tely (by fcntl()
cf00: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
cf10: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e   unixFileLock(un
cf20: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73  ixFile *pFile, s
cf30: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f  truct flock *pLo
cf40: 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ck){.  int rc;. 
cf50: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
cf60: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
cf70: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
cf80: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
cf90: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
cfa0: 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66  Inode!=0 );.  if
cfb0: 28 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  ( (pFile->ctrlFl
cfc0: 61 67 73 20 26 20 28 55 4e 49 58 46 49 4c 45 5f  ags & (UNIXFILE_
cfd0: 45 58 43 4c 7c 55 4e 49 58 46 49 4c 45 5f 52 44  EXCL|UNIXFILE_RD
cfe0: 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58 46 49 4c 45  ONLY))==UNIXFILE
cff0: 5f 45 58 43 4c 20 29 7b 0a 20 20 20 20 69 66 28  _EXCL ){.    if(
d000: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
d010: 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
d020: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
d030: 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ock;.      asser
d040: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
d050: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63  ==0 );.      loc
d060: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d070: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63  K_SET;.      loc
d080: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
d090: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
d0a0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
d0b0: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
d0c0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
d0d0: 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20  WRLCK;.      rc 
d0e0: 3d 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69  = osSetPosixAdvi
d0f0: 73 6f 72 79 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  soryLock(pFile->
d100: 68 2c 20 26 6c 6f 63 6b 2c 20 70 46 69 6c 65 29  h, &lock, pFile)
d110: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30  ;.      if( rc<0
d120: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d130: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f      pInode->bPro
d140: 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  cessLock = 1;.  
d150: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
d160: 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  k++;.    }else{.
d170: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
d180: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
d190: 20 72 63 20 3d 20 6f 73 53 65 74 50 6f 73 69 78   rc = osSetPosix
d1a0: 41 64 76 69 73 6f 72 79 4c 6f 63 6b 28 70 46 69  AdvisoryLock(pFi
d1b0: 6c 65 2d 3e 68 2c 20 70 4c 6f 63 6b 2c 20 70 46  le->h, pLock, pF
d1c0: 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ile);.  }.  retu
d1d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d1e0: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
d1f0: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
d200: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
d210: 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
d220: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
d230: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
d240: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
d250: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
d260: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
d270: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
d280: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
d290: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
d2a0: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
d2b0: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
d2c0: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
d2d0: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
d2e0: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
d2f0: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
d300: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
d310: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
d320: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
d330: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
d340: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
d350: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
d360: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
d370: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
d380: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
d390: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
d3a0: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
d3b0: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
d3c0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
d3d0: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
d3e0: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
d3f0: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
d400: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
d410: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
d420: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
d430: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
d440: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
d450: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
d460: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
d470: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
d480: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
d490: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d4a0: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
d4b0: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
d4c0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
d4d0: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
d4e0: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
d4f0: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
d500: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
d510: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
d520: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
d530: 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  k){.  /* The fol
d540: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
d550: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
d560: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
d570: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
d580: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
d590: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
d5a0: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
d5b0: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
d5c0: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
d5d0: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
d5e0: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
d5f0: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
d600: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
d610: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
d620: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
d630: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
d640: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
d650: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
d660: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
d670: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
d680: 74 68 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73  th Windows95 sys
d690: 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75  tems simultaneou
d6a0: 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69  sly.  ** accessi
d6b0: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
d6c0: 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61  base file, in ca
d6d0: 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20  se that is ever 
d6e0: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
d6f0: 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69   ** Symbols defi
d700: 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65  ned in os.h inde
d710: 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69  ntify the 'pendi
d720: 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65  ng byte' and the
d730: 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20   'reserved.  ** 
d740: 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67  byte', each sing
d750: 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c  le bytes at well
d760: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20   known offsets, 
d770: 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20  and the 'shared 
d780: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
d790: 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30  , a range of 510
d7a0: 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c   bytes at a well
d7b0: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20   known offset.. 
d7c0: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61   **.  ** To obta
d7d0: 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  in a SHARED lock
d7e0: 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  , a read-lock is
d7f0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
d800: 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62   'pending.  ** b
d810: 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69  yte'.  If this i
d820: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 27 73  s successful, 's
d830: 68 61 72 65 64 20 62 79 74 65 20 72 61 6e 67 65  hared byte range
d840: 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64  ' is read-locked
d850: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6c 6f  .  ** and the lo
d860: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
d870: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
d880: 64 2e 20 20 28 4c 65 67 61 63 79 20 6e 6f 74 65  d.  (Legacy note
d890: 3a 20 20 57 68 65 6e 0a 20 20 2a 2a 20 53 51 4c  :  When.  ** SQL
d8a0: 69 74 65 20 77 61 73 20 66 69 72 73 74 20 64 65  ite was first de
d8b0: 76 65 6c 6f 70 65 64 2c 20 57 69 6e 64 6f 77 73  veloped, Windows
d8c0: 39 35 20 73 79 73 74 65 6d 73 20 77 65 72 65 20  95 systems were 
d8d0: 73 74 69 6c 6c 20 76 65 72 79 20 63 6f 6d 6d 6f  still very commo
d8e0: 6e 2c 0a 20 20 2a 2a 20 61 6e 64 20 57 69 64 6e  n,.  ** and Widn
d8f0: 6f 77 73 39 35 20 6c 61 63 6b 73 20 61 20 73 68  ows95 lacks a sh
d900: 61 72 65 64 2d 6c 6f 63 6b 20 63 61 70 61 62 69  ared-lock capabi
d910: 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 20 57 69 6e  lity.  So on Win
d920: 64 6f 77 73 39 35 2c 20 61 0a 20 20 2a 2a 20 73  dows95, a.  ** s
d930: 69 6e 67 6c 65 20 72 61 6e 64 6f 6d 6c 79 20 73  ingle randomly s
d940: 65 6c 65 63 74 65 64 20 62 79 20 66 72 6f 6d 20  elected by from 
d950: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
d960: 20 72 61 6e 67 65 27 20 69 73 20 6c 6f 63 6b 65   range' is locke
d970: 64 2e 0a 20 20 2a 2a 20 57 69 6e 64 6f 77 73 39  d..  ** Windows9
d980: 35 20 69 73 20 6e 6f 77 20 70 72 65 74 74 79 20  5 is now pretty 
d990: 6d 75 63 68 20 65 78 74 69 6e 63 74 2c 20 62 75  much extinct, bu
d9a0: 74 20 74 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75  t this work-arou
d9b0: 6e 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  nd for the.  ** 
d9c0: 6c 61 63 6b 20 6f 66 20 73 68 61 72 65 64 2d 6c  lack of shared-l
d9d0: 6f 63 6b 73 20 6f 6e 20 57 69 6e 64 6f 77 73 39  ocks on Windows9
d9e0: 35 20 6c 69 76 65 73 20 6f 6e 2c 20 66 6f 72 20  5 lives on, for 
d9f0: 62 61 63 6b 77 61 72 64 73 0a 20 20 2a 2a 20 63  backwards.  ** c
da00: 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 29 0a 20  ompatibility.). 
da10: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
da20: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
da30: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
da40: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
da50: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
da60: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
da70: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
da80: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
da90: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
daa0: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
dab0: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
dac0: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
dad0: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
dae0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
daf0: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
db00: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
db10: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
db20: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
db30: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
db40: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
db50: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
db60: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
db70: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
db80: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
db90: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
dba0: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
dbb0: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
dbc0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
dbd0: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
dbe0: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
dbf0: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
dc00: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
dc10: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
dc20: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
dc30: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
dc40: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
dc50: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
dc60: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
dc70: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
dc80: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
dc90: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
dca0: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
dcb0: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
dcc0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
dcd0: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
dce0: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
dcf0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
dd00: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
dd10: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
dd20: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
dd30: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
dd40: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
dd50: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
dd60: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
dd70: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
dd80: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
dd90: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
dda0: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
ddb0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
ddc0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
ddd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
dde0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
ddf0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
de00: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
de10: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
de20: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
de30: 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20   tErrno = 0;..  
de40: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
de50: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
de60: 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
de70: 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
de80: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
de90: 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ->h,.      azFil
dea0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
deb0: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
dec0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
ded0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
dee0: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  (pFile->pInode->
def0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c  eFileLock), pFil
df00: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
df10: 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70  ed,.      osGetp
df20: 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  id(0)));..  /* I
df30: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
df40: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
df50: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
df60: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
df70: 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
df80: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
df90: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
dfa0: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
dfb0: 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
dfc0: 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
dfd0: 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
dfe0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
dff0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
e000: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
e010: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
e020: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
e030: 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c  dy held) (unix)\
e040: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
e050: 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
e060: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
e070: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
e080: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
e090: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
e0a0: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
e0b0: 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  e is correct..  
e0c0: 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
e0d0: 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
e0e0: 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
e0f0: 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
e100: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
e110: 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
e120: 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
e130: 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
e140: 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
e150: 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
e160: 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
e170: 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
e180: 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
e190: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
e1a0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
e1b0: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
e1c0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
e1d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
e1e0: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
e1f0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
e200: 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
e210: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
e220: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
e230: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
e240: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
e250: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
e260: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
e270: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
e280: 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
e290: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
e2a0: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
e2b0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
e2c0: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
e2d0: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
e2e0: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
e2f0: 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
e300: 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
e310: 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
e320: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
e330: 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
e340: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
e350: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
e360: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
e370: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  && .          (p
e380: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e390: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
e3a0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
e3b0: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
e3c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
e3d0: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  USY;.    goto en
e3e0: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
e3f0: 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
e400: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
e410: 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
e420: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
e430: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
e440: 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
e450: 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
e460: 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
e470: 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
e480: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
e490: 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
e4a0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
e4b0: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
e4c0: 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
e4d0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
e4e0: 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
e4f0: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
e500: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
e510: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
e520: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
e530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
e540: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
e550: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e560: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
e570: 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
e580: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
e590: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
e5a0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
e5b0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
e5c0: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
e5d0: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20  d_lock;.  }...  
e5e0: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
e5f0: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
e600: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
e610: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
e620: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
e630: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
e640: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
e650: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
e660: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
e670: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
e680: 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  */.  lock.l_l
e690: 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e  en = 1L;.  lock.
e6a0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
e6b0: 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65  SET;.  if( eFile
e6c0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
e6d0: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
e6e0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
e6f0: 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
e700: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
e710: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
e720: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
e730: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
e740: 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a  ED_LOCK?F_RDLCK:
e750: 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f  F_WRLCK);.    lo
e760: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
e770: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69  DING_BYTE;.    i
e780: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
e790: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
e7a0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
e7b0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
e7c0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
e7d0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
e7e0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
e7f0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
e800: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
e810: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  Y ){.        sto
e820: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
e830: 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
e840: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
e850: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
e860: 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e   }...  /* If con
e870: 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
e880: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
e890: 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
e8a0: 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
e8b0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
e8c0: 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
e8d0: 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
e8e0: 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
e8f0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
e900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
e910: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
e920: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e930: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e940: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
e950: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
e960: 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  K );..    /* Now
e970: 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
e980: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
e990: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
e9a0: 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  FIRST;.    lock.
e9b0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
e9c0: 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  IZE;.    if( uni
e9d0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
e9e0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
e9f0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ea00: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ea10: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
ea20: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
ea30: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
ea40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ea50: 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
ea60: 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
ea70: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
ea80: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
ea90: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
eaa0: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63  en = 1L;.    loc
eab0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
eac0: 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  CK;.    if( unix
ead0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
eae0: 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51  &lock) && rc==SQ
eaf0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
eb00: 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68   /* This could h
eb10: 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74  appen with a net
eb20: 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20  work mount */.  
eb30: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
eb40: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
eb50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
eb60: 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CK; .    }..    
eb70: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
eb80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
eb90: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
eba0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
ebb0: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
ebc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
ebd0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
ebe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
ebf0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
ec00: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
ec10: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
ec20: 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
ec30: 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
ec40: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
ec50: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
ec60: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
ec70: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
ec80: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
ec90: 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
eca0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
ecb0: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
ecc0: 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73  in this.    ** s
ecd0: 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
ece0: 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
ecf0: 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
ed00: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
ed10: 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
ed20: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
ed30: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
ed40: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
ed50: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
ed60: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
ed70: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
ed80: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
ed90: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
eda0: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
edb0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
edc0: 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69  t( 0!=pFile->eFi
edd0: 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f  leLock );.    lo
ede0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
edf0: 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  LCK;..    assert
ee00: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ( eFileLock==RES
ee10: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46  ERVED_LOCK || eF
ee20: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
ee30: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69  VE_LOCK );.    i
ee40: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  f( eFileLock==RE
ee50: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
ee60: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
ee70: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
ee80: 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  E;.      lock.l_
ee90: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65  len = 1L;.    }e
eea0: 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  lse{.      lock.
eeb0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
eec0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f  _FIRST;.      lo
eed0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
eee0: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20  D_SIZE;.    }.. 
eef0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
ef00: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
ef10: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
ef20: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
ef30: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
ef40: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
ef50: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
ef60: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
ef70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ef80: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
ef90: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
efa0: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
efb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
efc0: 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c  }.  ..#ifdef SQL
efd0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53  ITE_DEBUG.  /* S
efe0: 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  et up the transa
eff0: 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68  ction-counter ch
f000: 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c  ange checking fl
f010: 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72  ags when.  ** tr
f020: 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
f030: 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52   a SHARED to a R
f040: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54  ESERVED lock.  T
f050: 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66  he change.  ** f
f060: 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45  rom SHARED to RE
f070: 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65  SERVED marks the
f080: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
f090: 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74  normal.  ** writ
f0a0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74  e operation (not
f0b0: 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72   a hot journal r
f0c0: 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20  ollback)..  */. 
f0d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f0e0: 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e  OK.   && pFile->
f0f0: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
f100: 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69  D_LOCK.   && eFi
f110: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
f120: 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70  _LOCK.  ){.    p
f130: 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
f140: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  hng = 0;.    pFi
f150: 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  le->dbUpdate = 0
f160: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
f170: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a  ormalWrite = 1;.
f180: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69    }.#endif...  i
f190: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f1a0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
f1b0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
f1c0: 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
f1d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
f1e0: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
f1f0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
f200: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
f210: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
f220: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
f230: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
f240: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
f250: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
f260: 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e  ..end_lock:.  un
f270: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
f280: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
f290: 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e      %d %s %s (un
f2a0: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
f2b0: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
f2c0: 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
f2d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
f2e0: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
f2f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
f300: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
f310: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f320: 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61   used by file ha
f330: 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68  ndle pFile to th
f340: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
f350: 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  ** pUnused list.
f360: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f370: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69  setPendingFd(uni
f380: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
f390: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
f3a0: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
f3b0: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
f3c0: 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c  usedFd *p = pFil
f3d0: 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  e->pPreallocated
f3e0: 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65  Unused;.  p->pNe
f3f0: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  xt = pInode->pUn
f400: 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e  used;.  pInode->
f410: 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70  pUnused = p;.  p
f420: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
f430: 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
f440: 61 74 65 64 55 6e 75 73 65 64 20 3d 20 30 3b 0a  atedUnused = 0;.
f450: 20 20 6e 55 6e 75 73 65 64 46 64 2b 2b 3b 0a 7d    nUnusedFd++;.}
f460: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
f470: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
f480: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
f490: 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
f4a0: 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
f4b0: 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
f4c0: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
f4d0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
f4e0: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
f4f0: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
f500: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
f510: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
f520: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
f530: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
f540: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
f550: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
f560: 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46   .** If handleNF
f570: 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c  SUnlock is true,
f580: 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61   then on downgra
f590: 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
f5a0: 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44  E_LOCK to SHARED
f5b0: 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e  .** the byte ran
f5c0: 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e  ge is divided in
f5d0: 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74  to 2 parts and t
f5e0: 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73  he first part is
f5f0: 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a   unlocked then.*
f600: 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20  * set to a read 
f610: 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f  lock, then the o
f620: 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d  ther part is sim
f630: 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54  ply unlocked.  T
f640: 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72  his works .** ar
f650: 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53  ound a bug in BS
f660: 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73  D NFS lockd (als
f670: 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58  o seen on MacOSX
f680: 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69   10.3+) that fai
f690: 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65  ls to .** remove
f6a0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
f6b0: 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e  on a region when
f6c0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
f6d0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
f6e0: 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73  nt posixUnlock(s
f6f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
f700: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20   int eFileLock, 
f710: 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  int handleNFSUnl
f720: 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ock){.  unixFile
f730: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
f740: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
f750: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
f760: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
f770: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
f780: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
f790: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
f7a0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
f7b0: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
f7c0: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
f7d0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
f7e0: 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
f7f0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
f800: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
f810: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f820: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
f830: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
f840: 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
f850: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
f860: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
f870: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
f880: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
f890: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
f8a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f8b0: 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
f8c0: 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
f8d0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
f8e0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
f8f0: 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
f900: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
f910: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
f920: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
f930: 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
f940: 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
f950: 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65  leLock );..#ifde
f960: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
f970: 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63     /* When reduc
f980: 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20  ing a lock such 
f990: 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65  that other proce
f9a0: 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20  sses can start. 
f9b0: 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68     ** reading th
f9c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
f9d0: 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65  again, make sure
f9e0: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
f9f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
fa00: 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
fa10: 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
fa20: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
fa30: 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64   ** file changed
fa40: 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
fa50: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
fa60: 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20   not updated,.  
fa70: 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
fa80: 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61  ctions to the sa
fa90: 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f  me file might no
faa0: 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20  t realize that. 
fab0: 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68     ** the file h
fac0: 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68  as changed and h
fad0: 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b  ence might not k
fae0: 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65  now to flush the
faf0: 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  ir.    ** cache.
fb00: 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73    The use of a s
fb10: 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c  tale cache can l
fb20: 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
fb30: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
fb40: 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  */.    pFile->in
fb50: 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
fb60: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
fb70: 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61  downgrading to a
fb80: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
fb90: 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65  NFS involves cle
fba0: 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20  aring the write 
fbb0: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f  lock.    ** befo
fbc0: 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20  re establishing 
fbd0: 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74  the readlock - t
fbe0: 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63  o avoid a race c
fbf0: 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e  ondition we down
fc00: 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  grade.    ** the
fc10: 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b   lock in 2 block
fc20: 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20  s, so that part 
fc30: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c  of the range wil
fc40: 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20  l be covered by 
fc50: 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  a .    ** write 
fc60: 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72  lock until the r
fc70: 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62  est is covered b
fc80: 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20  y a read lock:. 
fc90: 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57     **  1:   [WWW
fca0: 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20  WW].    **  2:  
fcb0: 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20   [....W].    ** 
fcc0: 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20   3:   [RRRRW].  
fcd0: 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52    **  4:   [RRRR
fce0: 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .].    */.    if
fcf0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
fd00: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69 66 20  RED_LOCK ){.#if 
fd10: 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45  !defined(__APPLE
fd20: 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45  __) || !SQLITE_E
fd30: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
fd40: 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29  YLE.      (void)
fd50: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b  handleNFSUnlock;
fd60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
fd70: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d  andleNFSUnlock==
fd80: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  0 );.#endif.#if 
fd90: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
fda0: 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
fdb0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
fdc0: 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64  E.      if( hand
fdd0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20  leNFSUnlock ){. 
fde0: 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
fdf0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
fe00: 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
fe10: 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rom system call 
fe20: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  errors */.      
fe30: 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20    off_t divSize 
fe40: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  = SHARED_SIZE - 
fe50: 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
fe60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
fe70: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
fe80: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
fe90: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
fea0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
feb0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
fec0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
fed0: 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
fee0: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
fef0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
ff00: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
ff10: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
ff20: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
ff30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ff40: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
ff50: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
ff60: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
ff70: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
ff80: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
ff90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ffa0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
ffb0: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
ffc0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
ffd0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
ffe0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
fff0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
10000 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
10010 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
10020 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
10030 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
10040 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
10050 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
10060 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
10070 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
10080 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
10090 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
100a0 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
100b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
100c0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
100d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
100e0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
100f0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
10100 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10110 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
10120 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
10130 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
10140 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
10150 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
10160 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
10170 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10180 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
10190 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20  IRST+divSize;.  
101a0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
101b0 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64   = SHARED_SIZE-d
101c0 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
101d0 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
101e0 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
101f0 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
10200 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
10210 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
10220 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
10230 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
10240 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
10250 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
10260 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
10270 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
10280 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a    }.      }else.
10290 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
102a0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
102b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
102c0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20  CKING_STYLE */. 
102d0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c       {.        l
102e0 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
102f0 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
10300 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
10310 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
10320 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
10330 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
10340 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
10350 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
10360 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
10370 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
10380 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 20  lock) ){.       
10390 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c     /* In theory,
103a0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69   the call to uni
103b0 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e  xFileLock() cann
103c0 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65 20  ot fail because 
103d0 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  another.        
103e0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20    ** process is 
103f0 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d  holding an incom
10400 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66  patible lock. If
10410 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a   it does, this .
10420 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
10430 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
10440 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
10450 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   not following t
10460 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20  he locking.     
10470 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c       ** protocol
10480 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
10490 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
104a0 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52  _IOERR_RDLOCK. R
104b0 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
104c0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
104d0 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20  Y would confuse 
104e0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
104f0 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74 20  (in practice it 
10500 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20 20  causes .        
10510 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74    ** an assert t
10520 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20  o fail). */ .   
10530 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
10540 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
10550 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
10560 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
10570 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20   errno);.       
10580 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
10590 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
105a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
105b0 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
105c0 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e  UNLCK;.    lock.
105d0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
105e0 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
105f0 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
10600 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
10610 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65  _len = 2L;  asse
10620 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  rt( PENDING_BYTE
10630 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54  +1==RESERVED_BYT
10640 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  E );.    if( uni
10650 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
10660 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
10670 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
10680 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
10690 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
106a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
106b0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
106c0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
106d0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
106e0 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  o);.      goto e
106f0 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d  nd_unlock;.    }
10700 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65  .  }.  if( eFile
10710 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
10720 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
10730 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
10740 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
10750 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
10760 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
10770 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
10780 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
10790 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
107a0 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
107b0 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
107c0 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
107d0 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20  ->nShared--;.   
107e0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68   if( pInode->nSh
107f0 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ared==0 ){.     
10800 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
10810 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f  _UNLCK;.      lo
10820 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
10830 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
10840 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63  ck.l_start = loc
10850 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20  k.l_len = 0L;.  
10860 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
10870 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
10880 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
10890 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
108a0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
108b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
108c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
108d0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
108e0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
108f0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
10900 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
10910 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
10920 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
10930 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10940 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
10950 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
10960 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
10970 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61  count of locks a
10980 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65  gainst this same
10990 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65   file.  When the
109a0 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65  .    ** count re
109b0 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73  aches zero, clos
109c0 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65  e any other file
109d0 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f   descriptors who
109e0 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  se close.    ** 
109f0 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65 63  was deferred bec
10a00 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64  ause of outstand
10a10 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a  ing locks..    *
10a20 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  /.    pInode->nL
10a30 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ock--;.    asser
10a40 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
10a50 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
10a60 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
10a70 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65  ){.      closePe
10a80 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
10a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f  .    }.  }..end_
10aa0 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  unlock:.  unixLe
10ab0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
10ac0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10ad0 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ) pFile->eFileLo
10ae0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
10af0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10b00 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
10b10 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
10b20 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10b30 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
10b40 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
10b50 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
10b60 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
10b70 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
10b80 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
10b90 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
10ba0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
10bb0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
10bc0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
10bd0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
10be0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
10bf0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10c00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
10c10 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
10c20 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
10c30 4c 6f 63 6b 29 7b 0a 23 69 66 20 53 51 4c 49 54  Lock){.#if SQLIT
10c40 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
10c50 30 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  0.  assert( eFil
10c60 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
10c70 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65  CK || ((unixFile
10c80 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75   *)id)->nFetchOu
10c90 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20  t==0 );.#endif. 
10ca0 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
10cb0 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
10cc0 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51  k, 0);.}..#if SQ
10cd0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
10ce0 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
10cf0 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78  unixMapfile(unix
10d00 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e  File *pFd, i64 n
10d10 42 79 74 65 29 3b 0a 73 74 61 74 69 63 20 76 6f  Byte);.static vo
10d20 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
10d30 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 3b  (unixFile *pFd);
10d40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
10d50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72  his function per
10d60 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73 20  forms the parts 
10d70 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69  of the "close fi
10d80 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a  le" operation .*
10d90 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  * common to all 
10da0 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e  locking schemes.
10db0 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64   It closes the d
10dc0 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c  irectory and fil
10dd0 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66  e.** handles, if
10de0 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c   they are valid,
10df0 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69   and sets all fi
10e00 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78  elds of the unix
10e10 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
10e20 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74  e to 0..**.** It
10e30 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73   is *not* necess
10e40 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ary to hold the 
10e50 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73 20  mutex when this 
10e60 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10e70 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78  d,.** even on Vx
10e80 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20  Works.  A mutex 
10e90 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64  will be acquired
10ea0 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74   on VxWorks by t
10eb0 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c  he.** vxworksRel
10ec0 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75  easeFileId() rou
10ed0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
10ee0 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  int closeUnixFil
10ef0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10f00 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
10f10 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10f20 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53 51 4c 49  le*)id;.#if SQLI
10f30 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
10f40 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61 70 66 69  >0.  unixUnmapfi
10f50 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69  le(pFile);.#endi
10f60 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  f.  if( pFile->h
10f70 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73  >=0 ){.    robus
10f80 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
10f90 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
10fa0 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  _);.    pFile->h
10fb0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f   = -1;.  }.#if O
10fc0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
10fd0 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
10fe0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
10ff0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
11000 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
11010 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65    osUnlink(pFile
11020 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
11030 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  lName);.    }.  
11040 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65    vxworksRelease
11050 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49  FileId(pFile->pI
11060 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  d);.    pFile->p
11070 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  Id = 0;.  }.#end
11080 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
11090 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c  _UNLINK_AFTER_CL
110a0 4f 53 45 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  OSE.  if( pFile-
110b0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
110c0 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a  XFILE_DELETE ){.
110d0 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69      osUnlink(pFi
110e0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
110f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 28 63  sqlite3_free(*(c
11100 68 61 72 2a 2a 29 26 70 46 69 6c 65 2d 3e 7a 50  har**)&pFile->zP
11110 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ath);.    pFile-
11120 3e 7a 50 61 74 68 20 3d 20 30 3b 0a 20 20 7d 0a  >zPath = 0;.  }.
11130 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
11140 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  (("CLOSE   %-3d\
11150 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
11160 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
11170 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
11180 65 28 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c  e(pFile->pPreall
11190 6f 63 61 74 65 64 55 6e 75 73 65 64 29 3b 0a 20  ocatedUnused);. 
111a0 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
111b0 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
111c0 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
111d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
111e0 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
111f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
11200 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
11210 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
11220 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11230 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11240 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
11250 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46  )id;.  verifyDbF
11260 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e  ile(pFile);.  un
11270 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
11280 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74  LOCK);.  unixEnt
11290 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
112a0 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65   unixFile.pInode
112b0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
112c0 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65   here. Otherwise
112d0 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c  , a different cl
112e0 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ose.  ** routine
112f0 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f   (e.g. nolockClo
11300 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63  se()) would be c
11310 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20  alled instead.. 
11320 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
11330 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
11340 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  ck>0 || pFile->p
11350 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
11360 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ock==0 );.  if( 
11370 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49  ALWAYS(pFile->pI
11380 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e  node) && pFile->
11390 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
113a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
113b0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
113c0 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
113d0 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
113e0 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
113f0 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
11400 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
11410 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
11420 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
11430 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
11440 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
11450 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
11460 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
11470 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
11480 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
11490 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
114a0 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
114b0 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
114c0 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
114d0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
114e0 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ile);.  rc = clo
114f0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
11500 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
11510 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
11520 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
11530 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
11540 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
11550 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
11560 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
11570 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
11580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115c0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
115d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11610 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11630 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
11640 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
11650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11660 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
11670 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
11680 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
11690 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
116a0 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
116b0 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
116c0 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
116d0 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
116e0 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
116f0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
11700 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
11710 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
11720 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
11730 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
11740 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
11750 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
11760 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
11770 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
11780 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
11790 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
117a0 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
117b0 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
117c0 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
117d0 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
117e0 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
117f0 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
11800 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
11810 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
11820 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
11830 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
11840 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
11850 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
11860 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
11870 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
11880 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
11890 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
118a0 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
118b0 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
118c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
118d0 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
118e0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
118f0 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
11900 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
11910 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
11920 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
11930 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
11940 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
11950 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
11960 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11970 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
11980 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
11990 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
119a0 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
119b0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
119c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
119d0 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
119e0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
119f0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
11a00 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
11a10 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
11a20 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
11a30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11a40 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
11a50 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
11a60 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
11a70 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
11a80 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
11a90 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
11aa0 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
11ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11ac0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
11ad0 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
11ae0 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
11af0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
11b00 2a 69 64 29 20 7b 0a 23 69 66 64 65 66 20 53 51  *id) {.#ifdef SQ
11b10 4c 49 54 45 5f 53 48 41 52 45 44 5f 4d 41 50 50  LITE_SHARED_MAPP
11b20 49 4e 47 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ING.  unixFile *
11b30 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  pFd = (unixFile*
11b40 29 69 64 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  )id;.  if( pFd->
11b50 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 75 6e  pInode ){.    un
11b60 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
11b70 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
11b80 49 6e 66 6f 28 70 46 64 29 3b 0a 20 20 20 20 75  Info(pFd);.    u
11b90 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
11ba0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
11bb0 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
11bc0 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  le(id);.}../****
11bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11be0 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
11bf0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
11c00 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
11c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
11c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
11c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cd0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d  ***** Begin dot-
11ce0 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  file Locking ***
11cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
11d10 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f  * The dotfile lo
11d20 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
11d30 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78  tion uses the ex
11d40 69 73 74 65 6e 63 65 20 6f 66 20 73 65 70 61 72  istence of separ
11d50 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65  ate lock.** file
11d60 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72 65  s (really a dire
11d70 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f  ctory) to contro
11d80 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  l access to the 
11d90 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
11da0 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74  works.** on just
11db0 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c   about every fil
11dc0 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62  esystem imaginab
11dd0 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  le.  But there a
11de0 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73  re serious downs
11df0 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ides:.**.**    (
11e00 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72  1)  There is zer
11e10 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20  o concurrency.  
11e20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20  A single reader 
11e30 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72  blocks all other
11e40 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e  .**         conn
11e50 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61  ections from rea
11e60 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
11e70 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
11e80 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61  .**    (2)  An a
11e90 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68  pplication crash
11ea0 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63   or power loss c
11eb0 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c  an leave stale l
11ec0 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20  ock files.**    
11ed0 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f       sitting aro
11ee0 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f  und that need to
11ef0 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75   be cleared manu
11f00 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65  ally..**.** Neve
11f10 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c  rtheless, a dotl
11f20 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70  ock is an approp
11f30 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f  riate locking mo
11f40 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f  de for use if no
11f50 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
11f60 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76  g strategy is av
11f70 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44  ailable..**.** D
11f80 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77  otfile locking w
11f90 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67  orks by creating
11fa0 20 61 20 73 75 62 64 69 72 65 63 74 6f 72 79 20   a subdirectory 
11fb0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
11fc0 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20  ctory as.** the 
11fd0 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74  database and wit
11fe0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
11ff0 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63  but with a ".loc
12000 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64  k" extension add
12010 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74  ed..** The exist
12020 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64  ence of a lock d
12030 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65 73  irectory implies
12040 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
12050 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a  ck.  All other.*
12060 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53 48  * lock types (SH
12070 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
12080 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
12090 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
120a0 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
120b0 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
120c0 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
120d0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
120e0 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
120f0 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72   the.** lock dir
12100 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  ectory..*/.#defi
12110 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  ne DOTLOCK_SUFFI
12120 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a  X ".lock"../*.**
12130 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
12140 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
12150 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
12160 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
12170 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
12180 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
12190 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
121a0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
121b0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
121c0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
121d0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
121e0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
121f0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
12200 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
12210 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
12220 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
12230 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
12240 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
12250 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64  king..**.** In d
12260 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
12270 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78  either a lock ex
12280 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20  ists or it does 
12290 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73  not.  So in this
122a0 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66  .** variation of
122b0 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f   CheckReservedLo
122c0 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69  ck(), *pResOut i
122d0 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
122e0 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   any lock.** is 
122f0 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
12300 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
12310 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
12320 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
12330 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65  t dotlockCheckRe
12340 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
12350 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12360 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
12370 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12380 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
12390 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
123a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
123b0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
123c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
123d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
123e0 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
123f0 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
12400 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12410 72 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63  reserved = osAcc
12420 65 73 73 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  ess((const char*
12430 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
12440 6f 6e 74 65 78 74 2c 20 30 29 3d 3d 30 3b 0a 20  ontext, 0)==0;. 
12450 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
12460 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
12470 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
12480 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
12490 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73  erved));.  *pRes
124a0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
124b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
124c0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
124d0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
124e0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
124f0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
12500 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
12510 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
12520 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
12530 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
12540 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
12550 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
12560 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
12570 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
12580 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
12590 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
125a0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
125b0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
125c0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
125d0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
125e0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
125f0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
12600 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
12610 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
12620 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
12630 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
12640 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
12650 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
12660 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
12670 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
12680 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
12690 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
126a0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
126b0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
126c0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
126d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
126e0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
126f0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
12700 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
12710 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
12720 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
12730 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
12740 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
12750 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
12760 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
12770 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
12780 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
12790 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
127a0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
127b0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
127c0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
127d0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
127e0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66  .**.** With dotf
127f0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20  ile locking, we 
12800 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70  really only supp
12810 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45  ort state (4): E
12820 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74  XCLUSIVE..** But
12830 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74   we track the ot
12840 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  her locking leve
12850 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a  ls internally..*
12860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
12870 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
12880 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
12890 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
128a0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
128b0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
128c0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
128d0 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
128e0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
128f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12900 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
12910 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
12920 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
12930 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
12940 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
12950 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
12960 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
12970 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
12980 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
12990 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
129a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
129b0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
129c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
129d0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f  eFileLock;.    /
129e0 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
129f0 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
12a00 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
12a10 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49  .#ifdef HAVE_UTI
12a20 4d 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f  ME.    utime(zLo
12a30 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23  ckFile, NULL);.#
12a40 65 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28  else.    utimes(
12a50 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
12a60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
12a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12a80 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
12a90 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
12aa0 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b  k */.  rc = osMk
12ab0 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30  dir(zLockFile, 0
12ac0 37 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30  777);.  if( rc<0
12ad0 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
12ae0 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
12af0 20 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74   the lock direct
12b00 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  ory */.    int t
12b10 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12b20 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d     if( EEXIST ==
12b30 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
12b40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
12b50 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
12b60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12b70 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
12b80 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
12b90 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
12ba0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12bb0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
12bc0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
12bd0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
12be0 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
12bf0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
12c00 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67  ;.  } .  .  /* g
12c10 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
12c20 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
12c30 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
12c40 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
12c50 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
12c60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
12c70 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
12c80 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
12c90 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
12ca0 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
12cb0 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
12cc0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
12cd0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
12ce0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
12cf0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
12d00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12d10 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
12d20 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
12d30 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
12d40 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
12d50 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
12d60 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
12d70 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
12d80 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
12d90 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
12da0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
12db0 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
12dc0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12dd0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
12de0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
12df0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12e00 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
12e10 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
12e20 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
12e30 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
12e40 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
12e50 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
12e60 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
12e70 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
12e80 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
12e90 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
12ea0 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
12eb0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
12ec0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
12ed0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
12ee0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
12ef0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
12f00 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
12f10 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
12f20 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
12f30 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
12f40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
12f50 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64    /* To downgrad
12f60 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d  e to shared, sim
12f70 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69  ply update our i
12f80 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f  nternal notion o
12f90 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  f the.  ** lock 
12fa0 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20  state.  No need 
12fb0 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65  to mess with the
12fc0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
12fd0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
12fe0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
12ff0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
13000 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
13010 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  D_LOCK;.    retu
13020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13030 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c  }.  .  /* To ful
13040 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ly unlock the da
13050 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74  tabase, delete t
13060 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  he lock file */.
13070 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
13080 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ock==NO_LOCK );.
13090 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a    rc = osRmdir(z
130a0 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
130b0 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74   rc<0 ){.    int
130c0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
130d0 0a 20 20 20 20 69 66 28 20 74 45 72 72 6e 6f 3d  .    if( tErrno=
130e0 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
130f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13100 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13110 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
13120 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
13130 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
13140 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
13150 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
13160 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
13170 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13180 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
13190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
131a0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
131b0 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
131c0 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
131d0 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
131e0 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
131f0 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
13200 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
13210 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46  e *id) {.  unixF
13220 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
13230 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73  ixFile*)id;.  as
13240 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
13250 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69   dotlockUnlock(i
13260 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73  d, NO_LOCK);.  s
13270 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
13280 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
13290 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f  t);.  return clo
132a0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
132b0 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
132c0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
132d0 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69   dot-file lock i
132e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
132f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13300 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13350 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133a0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
133b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
133c0 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e  gin flock Lockin
133d0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
133e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133f0 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  **.**.** Use the
13400 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20   flock() system 
13410 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20  call to do file 
13420 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66  locking..**.** f
13430 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69  lock() locking i
13440 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20  s like dot-file 
13450 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20  locking in that 
13460 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66  the various.** f
13470 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e  ine-grain lockin
13480 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74  g levels support
13490 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65  ed by SQLite are
134a0 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a   collapsed into.
134b0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c  ** a single excl
134c0 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20  usive lock.  In 
134d0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41  other words, SHA
134e0 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61  RED, RESERVED, a
134f0 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f  nd.** PENDING lo
13500 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  cks are the same
13510 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43   thing as an EXC
13520 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51  LUSIVE lock.  SQ
13530 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f  Lite.** still wo
13540 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20  rks when you do 
13550 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72  this, but concur
13560 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64  rency is reduced
13570 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61   since.** only a
13580 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
13590 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74  can be reading t
135a0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61  he database at a
135b0 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69   time..**.** Omi
135c0 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69  t this section i
135d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
135e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
135f0 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23   turned off.*/.#
13600 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
13610 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a  _LOCKING_STYLE..
13620 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63  /*.** Retry floc
13630 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  k() calls that f
13640 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a  ail with EINTR.*
13650 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73  /.#ifdef EINTR.s
13660 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
13670 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69  _flock(int fd, i
13680 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63  nt op){.  int rc
13690 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f  ;.  do{ rc = flo
136a0 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c  ck(fd,op); }whil
136b0 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
136c0 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
136d0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a  urn rc;.}.#else.
136e0 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f  # define robust_
136f0 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b  flock(a,b) flock
13700 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20  (a,b).#endif.   
13710 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72    ../*.** This r
13720 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
13730 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
13740 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
13750 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
13760 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
13770 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
13780 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
13790 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
137a0 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
137b0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
137c0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
137d0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
137e0 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
137f0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
13800 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
13810 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
13820 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
13830 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
13840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13850 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
13860 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13870 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
13880 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
13890 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
138a0 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
138b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
138c0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
138d0 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
138e0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
138f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
13900 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
13910 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
13920 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  File );.  .  /* 
13930 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
13940 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
13950 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
13960 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
13970 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
13980 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
13990 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
139a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
139b0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
139c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
139d0 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
139e0 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
139f0 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f     /* attempt to
13a00 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f   get the lock */
13a10 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72  .    int lrc = r
13a20 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
13a30 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
13a40 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66  LOCK_NB);.    if
13a50 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  ( !lrc ){.      
13a60 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c  /* got the lock,
13a70 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20   unlock it */.  
13a80 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74      lrc = robust
13a90 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
13aa0 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
13ab0 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20   if ( lrc ) {.  
13ac0 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
13ad0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
13ae0 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c    /* unlock fail
13af0 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
13b00 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20   */.        lrc 
13b10 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
13b20 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20  NLOCK; .        
13b30 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
13b40 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
13b50 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
13b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
13b70 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
13b80 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
13b90 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
13ba0 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
13bb0 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
13bc0 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
13bd0 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
13be0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13bf0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13c00 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
13c10 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
13c20 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
13c30 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rc) ){.        s
13c40 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
13c50 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
13c60 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
13c70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13c80 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
13c90 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
13ca0 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %d (flock)\n", 
13cb0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
13cc0 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65  served));..#ifde
13cd0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
13ce0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
13cf0 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 30 78  S.  if( (rc & 0x
13d00 66 66 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  ff) == SQLITE_IO
13d10 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
13d20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
13d30 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23  eserved=1;.  }.#
13d40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13d50 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
13d60 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70  K_ERRORS */.  *p
13d70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
13d80 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
13d90 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
13da0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
13db0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
13dc0 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
13dd0 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
13de0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
13df0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
13e00 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
13e10 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
13e20 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
13e30 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
13e40 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
13e50 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
13e60 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
13e70 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
13e80 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
13e90 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
13ea0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
13eb0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
13ec0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
13ed0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
13ee0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
13ef0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
13f00 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
13f10 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
13f20 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
13f30 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
13f40 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
13f50 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
13f60 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
13f70 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
13f80 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
13f90 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
13fa0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
13fb0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
13fc0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13fd0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
13fe0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
13ff0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
14000 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
14010 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
14020 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
14030 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
14040 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  USIVE.**.** floc
14050 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  k() only really 
14060 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
14070 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
14080 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
14090 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
140a0 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
140b0 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
140c0 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
140d0 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
140e0 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
140f0 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
14100 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
14110 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
14120 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
14130 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
14140 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
14150 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
14160 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
14170 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
14180 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
14190 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
141a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
141b0 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
141c0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
141d0 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e  FileLock) {.  in
141e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
141f0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
14200 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14210 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
14220 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69  pFile );..  /* i
14230 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
14240 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
14250 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
14260 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
14270 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
14280 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
14290 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
142a0 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
142b0 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
142c0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
142d0 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
142e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
142f0 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
14300 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
14310 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74  .  .  if (robust
14320 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
14330 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
14340 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74  NB)) {.    int t
14350 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
14360 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74     /* didn't get
14370 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a  , must be busy *
14380 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
14390 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
143a0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
143b0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
143c0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
143d0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
143e0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
143f0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
14400 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  );.    }.  } els
14410 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
14420 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
14430 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
14440 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
14450 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
14460 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
14470 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
14480 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
14490 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
144a0 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
144b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
144c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
144d0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
144e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
144f0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
14500 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
14510 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49   & 0xff) == SQLI
14520 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
14530 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
14540 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
14550 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
14560 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
14570 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
14580 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
14590 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
145a0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
145b0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
145c0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
145d0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
145e0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
145f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
14600 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
14610 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
14620 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
14630 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
14640 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
14650 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
14660 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
14670 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
14680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
14690 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
146a0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
146b0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
146c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
146d0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
146e0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
146f0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
14700 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
14710 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
14720 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
14730 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
14740 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14750 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
14760 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
14770 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
14780 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
14790 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
147a0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
147b0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
147c0 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
147d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
147e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
147f0 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
14800 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
14810 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
14820 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
14830 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
14840 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
14850 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
14860 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
14870 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
14880 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
14890 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
148a0 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
148b0 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  ( robust_flock(p
148c0 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
148d0 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
148e0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
148f0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
14900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14910 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
14920 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
14930 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
14940 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14950 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
14960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
14970 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
14980 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
14990 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
149a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
149b0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
149c0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
149d0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
149e0 69 64 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20  id) {.  assert( 
149f0 69 64 21 3d 30 20 29 3b 0a 20 20 66 6c 6f 63 6b  id!=0 );.  flock
14a00 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
14a10 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c  CK);.  return cl
14a20 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
14a30 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
14a40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
14a50 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
14a60 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a  _VXWORK */../***
14a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a80 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63   End of the floc
14a90 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  k lock implement
14aa0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
14ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
14b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
14b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b70 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65  ***** Begin Name
14b80 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b  d Semaphore Lock
14b90 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
14ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
14bb0 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
14bc0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
14bd0 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20  ly supported on 
14be0 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53  VxWorks..**.** S
14bf0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
14c00 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63   is like dot-loc
14c10 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74  k and flock in t
14c20 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e  hat it really on
14c30 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45  ly.** supports E
14c40 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67  XCLUSIVE locking
14c50 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  .  Only a single
14c60 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61   process can rea
14c70 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68  d or write.** th
14c80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14c90 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73  at a time.  This
14ca0 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69   reduces potenti
14cb0 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20  al concurrency, 
14cc0 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  but.** makes the
14cd0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
14ce0 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72  tion much easier
14cf0 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ..*/.#if OS_VXWO
14d00 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RKS../*.** This 
14d10 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
14d20 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
14d30 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
14d40 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
14d50 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
14d60 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
14d70 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
14d80 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
14d90 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
14da0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
14db0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
14dc0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
14dd0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
14de0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
14df0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
14e00 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
14e10 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
14e20 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
14e30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
14e40 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  mXCheckReservedL
14e50 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
14e60 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
14e70 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
14e80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
14e90 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
14ea0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14eb0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
14ec0 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
14ed0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
14ee0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
14ef0 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
14f00 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
14f10 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ile );..  /* Che
14f20 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
14f30 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
14f40 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
14f50 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
14f60 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
14f70 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
14f80 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
14f90 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
14fa0 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
14fb0 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
14fc0 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
14fd0 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
14fe0 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
14ff0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
15000 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f  m;..    if( sem_
15010 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
15020 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  1 ){.      int t
15030 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
15040 20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20       if( EAGAIN 
15050 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
15060 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15070 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
15080 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
15090 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
150a0 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
150b0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
150c0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
150d0 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  o);.      } else
150e0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
150f0 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
15100 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
15110 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
15120 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
15130 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
15140 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
15150 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
15160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15170 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
15180 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
15190 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
151a0 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
151b0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
151c0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
151d0 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
151e0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
151f0 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
15200 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
15210 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
15220 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
15230 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
15240 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
15250 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
15260 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
15270 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
15280 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
15290 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
152a0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
152b0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
152c0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
152d0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
152e0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
152f0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
15300 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
15310 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
15320 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
15330 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
15340 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
15350 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
15360 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
15370 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
15380 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
15390 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
153a0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
153b0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
153c0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
153d0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
153e0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
153f0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
15400 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
15410 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
15420 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
15430 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
15440 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
15450 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
15460 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
15470 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
15480 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
15490 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
154a0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
154b0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
154c0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
154d0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
154e0 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
154f0 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
15500 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
15510 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
15520 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
15530 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
15540 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
15550 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
15560 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
15570 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
15580 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
15590 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
155a0 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
155b0 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
155c0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
155d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
155e0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
155f0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
15600 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
15610 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
15620 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
15630 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
15640 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f 63 6b 28  ic int semXLock(
15650 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15660 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
15670 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
15680 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
15690 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
156a0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
156b0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74  ode->pSem;.  int
156c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
156d0 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
156e0 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
156f0 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
15700 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
15710 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
15720 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
15730 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
15740 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
15750 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
15760 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15770 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
15780 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15790 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
157a0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
157b0 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f   /* lock semapho
157c0 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20  re now but bail 
157d0 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79  out when already
157e0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66   locked. */.  if
157f0 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
15800 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72  em)==-1 ){.    r
15810 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15820 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
15830 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
15840 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
15850 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
15860 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
15870 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
15880 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e  leLock;.. sem_en
15890 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e  d_lock:.  return
158a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
158b0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
158c0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
158d0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
158e0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
158f0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
15900 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
15910 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
15920 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
15930 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
15940 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
15950 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
15960 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
15970 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
15980 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
15990 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
159a0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
159b0 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 73 71 6c  t semXUnlock(sql
159c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
159d0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
159e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
159f0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15a00 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
15a10 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
15a20 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72  ->pSem;..  asser
15a30 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73  t( pFile );.  as
15a40 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20  sert( pSem );.  
15a50 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
15a60 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
15a70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20  id=%d (sem)\n", 
15a80 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
15a90 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
15aa0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15ab0 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
15ac0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
15ad0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
15ae0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
15af0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
15b00 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
15b10 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
15b20 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
15b30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15b40 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
15b50 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
15b60 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
15b70 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
15b80 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
15b90 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15ba0 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
15bb0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
15bc0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
15bd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15be0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
15bf0 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
15c00 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
15c10 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
15c20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
15c30 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
15c40 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15c50 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15c60 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
15c70 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
15c80 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
15c90 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73  R(rc) ){.      s
15ca0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
15cb0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
15cc0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
15cd0 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
15ce0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
15cf0 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
15d00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15d10 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65   ** Close a file
15d20 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
15d30 20 73 65 6d 58 43 6c 6f 73 65 28 73 71 6c 69 74   semXClose(sqlit
15d40 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
15d50 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
15d60 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15d70 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15d80 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 69      semXUnlock(i
15d90 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
15da0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
15db0 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
15dc0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65  utex();.    rele
15dd0 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
15de0 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  le);.    unixLea
15df0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63  veMutex();.    c
15e00 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
15e10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
15e20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
15e30 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
15e40 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64  S */./*.** Named
15e50 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
15e60 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
15e70 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  able on VxWorks.
15e80 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
15e90 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
15ea0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
15eb0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
15ec0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
15ed0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
15ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15f20 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
15f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15f70 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
15f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15f90 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b  * Begin AFP Lock
15fa0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
15fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15fc0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20  *****.**.** AFP 
15fd0 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c  is the Apple Fil
15fe0 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41  ing Protocol.  A
15ff0 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20  FP is a network 
16000 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64  filesystem found
16010 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63  .** on Apple Mac
16020 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73  intosh computers
16030 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20   - both OS9 and 
16040 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64  OSX..**.** Third
16050 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74  -party implement
16060 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72  ations of AFP ar
16070 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  e available.  Bu
16080 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65  t this code here
16090 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  .** only works o
160a0 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64  n OSX..*/..#if d
160b0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
160c0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
160d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
160e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f  ./*.** The afpLo
160f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
16100 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
16110 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
16120 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74  cific state.*/.t
16130 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
16140 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16150 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16160 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
16170 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
16180 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20  int reserved;.  
16190 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
161a0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
161b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
161c0 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  pen file */.};..
161d0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
161e0 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
161f0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
16200 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
16210 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
16220 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
16230 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
16240 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
16250 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
16260 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
16270 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
16280 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
16290 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
162a0 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
162b0 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
162c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
162d0 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
162e0 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
162f0 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
16300 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
16310 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
16320 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
16330 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
16340 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
16350 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
16380 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
16390 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
163a0 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
163b0 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20  ngeLock2FSCTL   
163c0 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20       _IOWR('z', 
163d0 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
163e0 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a  angeLockPB2)../*
163f0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
16400 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e  ility for settin
16410 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20  g or clearing a 
16420 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f  bit-range lock o
16430 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65  n an.** AFP file
16440 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52  system..** .** R
16450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
16460 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
16470 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75  TE_BUSY on failu
16480 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
16490 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20  t afpSetLock(.  
164a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
164b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
164c0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
164d0 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
164e0 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  or unlocked */. 
164f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16510 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
16520 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20  criptor on path 
16530 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
16540 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20  ng long offset, 
16550 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
16560 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
16570 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
16580 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20  g long length,  
16590 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
165a0 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
165b0 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c  .  int setLockFl
165c0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
165d0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74    /* True to set
165e0 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f   lock.  False to
165f0 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29   clear lock */.)
16600 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
16610 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a  angeLockPB2 pb;.
16620 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
16630 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20  pb.unLockFlag = 
16640 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20  setLockFlag ? 0 
16650 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45  : 1;.  pb.startE
16660 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62  ndFlag = 0;.  pb
16670 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .offset = offset
16680 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20  ;.  pb.length = 
16690 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64  length; .  pb.fd
166a0 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a   = pFile->h;.  .
166b0 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
166c0 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20  ETLOCK [%s] for 
166d0 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c  %d%s in range %l
166e0 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20  lx:%llx\n", .   
166f0 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f   (setLockFlag?"O
16700 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65  N":"OFF"), pFile
16710 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f  ->h, (pb.fd==-1?
16720 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22  "[testval-1]":""
16730 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c  ),.    offset, l
16740 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d  ength));.  err =
16750 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
16760 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
16770 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
16780 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
16790 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
167a0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
167b0 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
167c0 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
167d0 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
167e0 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
167f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
16800 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
16810 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a  rror(tErrno)));.
16820 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
16830 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
16840 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51  RORS.    rc = SQ
16850 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65  LITE_BUSY;.#else
16860 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16870 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
16880 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20  ror(tErrno,.    
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168a0 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51  setLockFlag ? SQ
168b0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20  LITE_IOERR_LOCK 
168c0 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  : SQLITE_IOERR_U
168d0 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f  NLOCK);.#endif /
168e0 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
168f0 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  AFP_LOCK_ERRORS 
16900 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  */.    if( IS_LO
16910 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
16920 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
16930 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
16940 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  no);.    }.    r
16950 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c  eturn rc;.  } el
16960 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
16970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
16980 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
16990 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
169a0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
169b0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
169c0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
169d0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
169e0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
169f0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
16a00 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
16a10 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
16a20 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
16a30 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
16a40 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
16a50 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
16a60 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
16a70 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
16a80 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
16a90 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
16aa0 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
16ab0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68  static int afpCh
16ac0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
16ad0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
16ae0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
16af0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16b00 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
16b10 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
16b20 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
16b30 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
16b40 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16b50 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  t *context;.  . 
16b60 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
16b70 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
16b80 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
16b90 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
16ba0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
16bb0 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 61  ;.  context = (a
16bc0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
16bd0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
16be0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28  ngContext;.  if(
16bf0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
16c00 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f  ed ){.    *pResO
16c10 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ut = 1;.    retu
16c20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16c30 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
16c40 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
16c50 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
16c60 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
16c70 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20  threads */.  .  
16c80 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
16c90 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
16ca0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
16cb0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
16cc0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
16cd0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
16ce0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
16cf0 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
16d00 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
16d10 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
16d20 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
16d30 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  it..   */.  if( 
16d40 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
16d50 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53   /* lock the RES
16d60 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20  ERVED byte */.  
16d70 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53    int lrc = afpS
16d80 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16d90 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
16da0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
16db0 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51  1);  .    if( SQ
16dc0 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a  LITE_OK==lrc ){.
16dd0 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73        /* if we s
16de0 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69  ucceeded in taki
16df0 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20  ng the reserved 
16e00 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
16e10 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20  to restore.     
16e20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
16e30 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20   state */.      
16e40 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
16e50 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16e60 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
16e70 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
16e80 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
16e90 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65    /* if we faile
16ea0 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  d to get the loc
16eb0 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65  k then someone e
16ec0 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74  lse must have it
16ed0 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76   */.      reserv
16ee0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
16ef0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
16f00 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
16f10 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a    rc=lrc;.    }.
16f20 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
16f30 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
16f40 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
16f50 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66  OCK %d %d %d (af
16f60 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16f70 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
16f80 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  .  .  *pResOut =
16f90 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
16fa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16fb0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
16fc0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
16fd0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
16fe0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
16ff0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
17000 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
17010 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
17020 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
17030 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
17040 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
17050 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
17060 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
17070 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
17080 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
17090 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
170a0 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
170b0 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
170c0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
170d0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
170e0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
170f0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
17100 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
17110 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
17120 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
17130 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
17140 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
17150 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
17160 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
17170 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
17180 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
17190 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
171a0 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
171b0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
171c0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
171d0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
171e0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
171f0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
17200 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
17210 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
17220 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
17230 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
17240 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
17250 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
17260 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17270 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
17280 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
17290 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
172a0 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
172b0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
172c0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
172d0 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63  tatic int afpLoc
172e0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
172f0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
17300 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
17310 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
17320 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
17330 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
17340 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
17350 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
17360 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
17370 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
17380 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
17390 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
173a0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
173b0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
173c0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
173d0 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
173e0 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
173f0 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
17400 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
17410 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
17420 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
17430 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
17440 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
17450 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
17460 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
17470 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ck), pInode->nSh
17480 61 72 65 64 20 2c 20 6f 73 47 65 74 70 69 64 28  ared , osGetpid(
17490 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0)));..  /* If t
174a0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
174b0 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
174c0 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
174d0 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
174e0 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
174f0 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
17500 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f  use the afp_end_
17510 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
17520 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
17530 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
17540 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
17550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
17560 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
17570 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
17580 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
17590 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
175a0 61 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c  ady held) (afp)\
175b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
175c0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
175d0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
175e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
175f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
17600 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
17610 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
17620 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a   is correct.  **
17630 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
17640 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
17650 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
17660 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
17670 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
17680 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
17690 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
176a0 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
176b0 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
176c0 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
176d0 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
176e0 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
176f0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
17700 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
17710 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
17720 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
17730 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17740 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
17750 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
17760 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
17770 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
17780 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
17790 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
177a0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
177b0 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
177c0 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
177d0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
177e0 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
177f0 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
17800 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
17810 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
17820 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
17830 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
17840 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
17850 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
17860 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
17870 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
17880 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
17890 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
178a0 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
178b0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
178c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
178d0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
178e0 26 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f  && .       (pIno
178f0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
17900 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
17910 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
17920 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20  LOCK)).     ){. 
17930 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
17940 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  USY;.    goto af
17950 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
17960 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41    .  /* If a SHA
17970 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
17980 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
17990 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
179a0 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
179b0 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
179c0 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
179d0 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
179e0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
179f0 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
17a00 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
17a10 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
17a20 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
17a30 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  & .     (pInode-
17a40 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
17a50 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
17a60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  e->eFileLock==RE
17a70 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
17a80 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
17a90 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
17aa0 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
17ab0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
17ac0 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ck==0 );.    ass
17ad0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
17ae0 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46  ared>0 );.    pF
17af0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
17b00 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
17b10 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
17b20 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d++;.    pInode-
17b30 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
17b40 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17b50 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41  .  }.    .  /* A
17b60 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
17b70 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
17b80 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
17b90 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
17ba0 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
17bb0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
17bc0 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
17bd0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
17be0 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
17bf0 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
17c00 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
17c10 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
17c20 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
17c30 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17c40 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
17c50 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
17c60 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
17c70 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66  nt failed;.    f
17c80 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
17c90 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17ca0 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
17cb0 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
17cc0 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
17cd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
17ce0 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  led;.      goto 
17cf0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
17d00 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
17d10 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
17d20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
17d30 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
17d40 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
17d50 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
17d60 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
17d70 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
17d80 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
17d90 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
17da0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
17db0 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31  lrc1, lrc2, lrc1
17dc0 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c  Errno = 0;.    l
17dd0 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20  ong lk, mask;.  
17de0 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
17df0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
17e00 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17e10 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
17e20 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ck==0 );.       
17e30 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69   .    mask = (si
17e40 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f  zeof(long)==8) ?
17e50 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a   LARGEST_INT64 :
17e60 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
17e70 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
17e80 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44  read-lock SHARED
17e90 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20  _LOCK */.    /* 
17ea0 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75  note that the qu
17eb0 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e  ality of the ran
17ec0 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20  domness doesn't 
17ed0 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68  matter that much
17ee0 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e   */.    lk = ran
17ef0 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f  dom(); .    pIno
17f00 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d  de->sharedByte =
17f10 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48   (lk & mask)%(SH
17f20 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
17f30 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65      lrc1 = afpSe
17f40 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17f50 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
17f60 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
17f70 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
17f80 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b  aredByte, 1, 1);
17f90 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
17fa0 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a  _ERROR(lrc1) ){.
17fb0 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20        lrc1Errno 
17fc0 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
17fd0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
17fe0 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
17ff0 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
18000 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61   */.    lrc2 = a
18010 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18020 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18030 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
18040 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20  1, 0);.    .    
18050 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
18060 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20  R(lrc1) ) {.    
18070 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
18080 28 70 46 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e  (pFile, lrc1Errn
18090 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  o);.      rc = l
180a0 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc1;.      goto 
180b0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
180c0 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f    } else if( IS_
180d0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29  LOCK_ERROR(lrc2)
180e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
180f0 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc2;.      goto 
18100 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
18110 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63    } else if( lrc
18120 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  1 != SQLITE_OK )
18130 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72   {.      rc = lr
18140 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  c1;.    } else {
18150 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
18160 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
18170 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e  _LOCK;.      pIn
18180 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
18190 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
181a0 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  red = 1;.    }. 
181b0 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
181c0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
181d0 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e  LOCK && pInode->
181e0 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20  nShared>1 ){.   
181f0 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
18200 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
18210 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
18220 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
18230 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20  is.     ** same 
18240 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
18250 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
18260 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
18270 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
18280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
18290 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
182a0 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
182b0 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
182c0 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
182d0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
182e0 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
182f0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
18300 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
18310 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
18320 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  */.    int faile
18330 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  d = 0;.    asser
18340 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69  t( 0!=pFile->eFi
18350 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  leLock );.    if
18360 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52   (eFileLock >= R
18370 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
18380 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18390 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   < RESERVED_LOCK
183a0 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  ) {.        /* A
183b0 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
183c0 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  D lock */.      
183d0 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
183e0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
183f0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
18400 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
18410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61  );.      if( !fa
18420 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
18430 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
18440 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
18450 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61     }.    if (!fa
18460 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63  iled && eFileLoc
18470 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  k == EXCLUSIVE_L
18480 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  OCK) {.      /* 
18490 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
184a0 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  SIVE lock */.   
184b0 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52       .      /* R
184c0 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64  emove the shared
184d0 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79   lock before try
184e0 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20  ing the range.  
184f0 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20  we'll need to . 
18500 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c       ** reestabl
18510 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
18520 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20  ock if we can't 
18530 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f  get the  afpUnlo
18540 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck.      */.    
18550 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d    if( !(failed =
18560 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
18570 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18580 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
18590 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
185a0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f              pIno
185b0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
185c0 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 0)) ){.      
185d0 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20    int failed2 = 
185e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
185f0 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d     /* now attemm
18600 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78  pt to get the ex
18610 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e  clusive lock ran
18620 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ge */.        fa
18630 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
18640 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
18650 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
18660 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20  _FIRST, .       
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
18690 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  IZE, 1);.       
186a0 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28   if( failed && (
186b0 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74  failed2 = afpSet
186c0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
186d0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186f0 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
18700 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72  T + pInode->shar
18710 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29  edByte, 1, 1)) )
18720 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
18730 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68  an't reestablish
18740 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
18750 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20  .  Sqlite can't 
18760 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20  deal, this is.  
18770 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69          ** a cri
18780 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a  tical I/O error.
18790 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
187a0 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61         rc = ((fa
187b0 69 6c 65 64 20 26 20 30 78 66 66 29 20 3d 3d 20  iled & 0xff) == 
187c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
187d0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
187e0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
187f0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
18800 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
18810 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
18820 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
18830 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
18840 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
18850 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
18860 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
18870 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
18880 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
18890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
188a0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
188b0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
188c0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
188d0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
188e0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
188f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
18900 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
18910 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18920 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
18930 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
18940 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
18950 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
18960 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
18970 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
18980 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
18990 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
189a0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
189b0 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
189c0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
189d0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
189e0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
189f0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
18a00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
18a10 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
18a20 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
18a30 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
18a40 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
18a50 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
18a60 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
18a70 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
18a80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
18a90 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
18aa0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
18ab0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
18ac0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
18ad0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
18ae0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
18af0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
18b00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18b10 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  afpUnlock(sqlite
18b20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
18b30 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
18b40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18b50 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
18b60 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18b70 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
18b80 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
18b90 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
18ba0 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
18bb0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
18bc0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
18bd0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
18be0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b   skipShared = 0;
18bf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
18c00 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  EST.  int h = pF
18c10 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a  ile->h;.#endif..
18c20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
18c30 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
18c40 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
18c50 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
18c60 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
18c70 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
18c80 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
18c90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
18ca0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
18cb0 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
18cc0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
18cd0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
18ce0 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73  pid(0)));..  ass
18cf0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
18d00 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
18d10 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
18d20 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
18d30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18d40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
18d50 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
18d60 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
18d70 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
18d80 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
18d90 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
18da0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
18db0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
18dc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
18dd0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
18de0 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
18df0 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  k );.    Simulat
18e00 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
18e10 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
18e20 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
18e30 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18e40 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
18e50 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54     .#ifdef SQLIT
18e60 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57  E_DEBUG.    /* W
18e70 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
18e80 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
18e90 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
18ea0 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
18eb0 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
18ec0 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
18ed0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
18ee0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
18ef0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
18f00 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
18f10 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
18f20 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
18f30 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
18f40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18f50 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
18f60 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
18f70 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
18f80 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
18f90 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
18fa0 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
18fb0 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
18fc0 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
18fd0 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
18fe0 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
18ff0 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
19000 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
19010 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
19020 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
19030 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
19040 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
19050 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
19060 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
19070 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
19080 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
19090 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
190a0 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46  hng==1 );.    pF
190b0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
190c0 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
190d0 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c     .    if( pFil
190e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  e->eFileLock==EX
190f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
19100 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
19110 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
19120 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
19130 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
19140 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
19150 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19160 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
19170 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
19180 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
19190 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ed>1) ){.       
191a0 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
191b0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
191c0 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
191d0 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
191e0 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
191f0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
19200 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
19210 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  te;.        rc =
19220 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
19230 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
19240 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
19250 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
19260 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
19270 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31    skipShared = 1
19280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19290 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
192a0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
192b0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
192c0 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
192d0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
192e0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
192f0 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
19300 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
19310 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
19320 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
19330 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
19340 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
19350 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
19360 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
19370 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
19380 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
19390 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
193a0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  E, 1, 0);.      
193b0 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20  if( !rc ){ .    
193c0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
193d0 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20  erved = 0; .    
193e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
193f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19400 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
19410 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
19420 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
19430 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
19440 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
19450 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
19460 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
19470 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65  LITE_OK && eFile
19480 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
19490 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
194a0 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
194b0 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
194c0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
194d0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
194e0 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
194f0 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
19500 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
19510 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
19520 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
19530 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67      */.    unsig
19540 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
19550 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
19560 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
19570 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
19580 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
19590 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
195a0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
195b0 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c  0 ){.      Simul
195c0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
195d0 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
195e0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
195f0 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
19600 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
19610 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  (0);.      if( !
19620 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20  skipShared ){.  
19630 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
19640 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
19650 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
19660 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
19670 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
19680 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
19690 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
196a0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
196b0 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
196c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
196d0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
196e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
196f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19700 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
19710 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
19720 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
19730 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
19740 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
19750 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
19760 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
19770 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
19780 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
19790 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
197a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
197b0 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
197c0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
197d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
197e0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
197f0 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41  file & cleanup A
19800 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  FP specific lock
19810 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a  ing context .*/.
19820 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c  static int afpCl
19830 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
19840 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
19850 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19860 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
19870 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
19880 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
19890 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 28   );.  afpUnlock(
198a0 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
198b0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
198c0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  ;.  if( pFile->p
198d0 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e  Inode && pFile->
198e0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
198f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
19900 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
19910 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
19920 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
19930 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
19940 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
19950 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
19960 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
19970 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
19980 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
19990 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
199a0 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
199b0 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
199c0 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
199d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  .    ** the last
199e0 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
199f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74  ..    */.    set
19a00 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
19a10 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49  ;.  }.  releaseI
19a20 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
19a30 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19a40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
19a50 6e 74 65 78 74 29 3b 0a 20 20 72 63 20 3d 20 63  ntext);.  rc = c
19a60 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
19a70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
19a80 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
19a90 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
19aa0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19ab0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
19ac0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
19ad0 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
19ae0 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
19af0 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
19b00 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
19b10 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
19b20 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
19b30 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
19b40 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
19b50 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
19b60 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
19b70 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75  ailable.  If you
19b80 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66   don't compile f
19b90 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74  or a mac, then t
19ba0 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a  he "unix-afp".**
19bb0 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69   VFS is not avai
19bc0 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  lable..**.******
19bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
19be0 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c  End of the AFP l
19bf0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
19c00 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
19c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
19c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19c60 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
19c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
19cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19cd0 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53  ****** Begin NFS
19ce0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
19cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20  *********/..#if 
19d10 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19d20 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
19d30 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
19d40 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74  E./*. ** Lower t
19d50 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
19d60 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
19d70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
19d80 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
19d90 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65  ck. ** must be e
19da0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
19db0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a   SHARED_LOCK.. *
19dc0 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  *. ** If the loc
19dd0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
19de0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
19df0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
19e00 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65  or below. ** the
19e10 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
19e20 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
19e30 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
19e40 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  p.. */.static in
19e50 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  t nfsUnlock(sqli
19e60 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
19e70 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
19e80 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f  return posixUnlo
19e90 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
19ea0 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
19eb0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
19ec0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
19ed0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
19ee0 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
19ef0 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
19f00 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
19f10 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
19f20 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
19f30 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
19f40 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
19f50 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
19f60 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
19f70 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
19f80 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
19f90 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
19fa0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
19fb0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
19fc0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
19fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19fe0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
19ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1a030 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1a040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a080 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1a090 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
1a0a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
1a0b0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
1a0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a0d0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
1a0e0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
1a0f0 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
1a100 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
1a110 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
1a120 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
1a130 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
1a140 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
1a150 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
1a160 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
1a170 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
1a180 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
1a190 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
1a1a0 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
1a1b0 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
1a1c0 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
1a1d0 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
1a1e0 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
1a1f0 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
1a200 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
1a210 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
1a220 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
1a230 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1a240 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
1a250 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
1a260 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
1a270 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1a280 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1a290 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
1a2a0 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
1a2b0 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
1a2c0 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
1a2d0 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
1a2e0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
1a2f0 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
1a300 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
1a310 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
1a320 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
1a330 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
1a340 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
1a350 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
1a360 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79 20 66  READ.** in any f
1a370 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20  orm by default, 
1a380 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  we will not atte
1a390 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  mpt to define _X
1a3a0 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20  OPEN_SOURCE..** 
1a3b0 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34  See tickets #274
1a3c0 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a  1 and #2681..**.
1a3d0 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
1a3e0 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
1a3f0 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
1a400 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72   read the lastEr
1a410 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1a420 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1a430 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1a440 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
1a450 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
1a460 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
1a470 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
1a480 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
1a490 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72  got;.  int prior
1a4a0 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69   = 0;.#if (!defi
1a4b0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
1a4c0 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
1a4d0 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
1a4e0 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
1a4f0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1a500 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28    assert( cnt==(
1a510 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a  cnt&0x1ffff) );.
1a520 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e    assert( id->h>
1a530 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64  2 );.  do{.#if d
1a540 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1a550 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72  ).    got = osPr
1a560 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
1a570 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
1a580 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a590 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
1a5a0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
1a5b0 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20 67  E_PREAD64).    g
1a5c0 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69  ot = osPread64(i
1a5d0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
1a5e0 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
1a5f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
1a600 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65  ot = -1 );.#else
1a610 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  .    newOffset =
1a620 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
1a630 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
1a640 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1a650 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 20  rror( newOffset 
1a660 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  = -1 );.    if( 
1a670 6e 65 77 4f 66 66 73 65 74 3c 30 20 29 7b 0a 20  newOffset<0 ){. 
1a680 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1a690 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rno((unixFile*)i
1a6a0 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  d, errno);.     
1a6b0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1a6c0 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65  }.    got = osRe
1a6d0 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
1a6e0 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  cnt);.#endif.   
1a6f0 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20   if( got==cnt ) 
1a700 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67  break;.    if( g
1a710 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ot<0 ){.      if
1a720 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  ( errno==EINTR )
1a730 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69  { got = 1; conti
1a740 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69  nue; }.      pri
1a750 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  or = 0;.      st
1a760 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1a770 69 78 46 69 6c 65 2a 29 69 64 2c 20 20 65 72 72  ixFile*)id,  err
1a780 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  no);.      break
1a790 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1a7a0 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 63  got>0 ){.      c
1a7b0 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20  nt -= got;.     
1a7c0 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a   offset += got;.
1a7d0 20 20 20 20 20 20 70 72 69 6f 72 20 2b 3d 20 67        prior += g
1a7e0 6f 74 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  ot;.      pBuf =
1a7f0 20 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28   (void*)(got + (
1a800 63 68 61 72 2a 29 70 42 75 66 29 3b 0a 20 20 20  char*)pBuf);.   
1a810 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74   }.  }while( got
1a820 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e  >0 );.  TIMER_EN
1a830 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  D;.  OSTRACE(("R
1a840 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20  EAD    %-3d %5d 
1a850 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20  %7lld %llu\n",. 
1a860 20 20 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68             id->h
1a870 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66  , got+prior, off
1a880 73 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52  set-prior, TIMER
1a890 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65  _ELAPSED));.  re
1a8a0 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a  turn got+prior;.
1a8b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
1a8c0 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
1a8d0 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
1a8e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1a8f0 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
1a900 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
1a910 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
1a920 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
1a930 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
1a940 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1a950 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c   unixRead(.  sql
1a960 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
1a970 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20    void *pBuf, . 
1a980 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
1a990 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
1a9a0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
1a9b0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1a9c0 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f  e *)id;.  int go
1a9d0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  t;.  assert( id 
1a9e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
1a9f0 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  set>=0 );.  asse
1aa00 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20  rt( amt>0 );..  
1aa10 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
1aa20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
1aa30 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61  ot a journal, ma
1aa40 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20  ster-journal or 
1aa50 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c  temp.  ** file),
1aa60 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
1aa70 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
1aa80 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20  should never be 
1aa90 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1aaa0 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
1aab0 72 74 28 20 70 46 69 6c 65 2d 3e 70 50 72 65 61  rt( pFile->pPrea
1aac0 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 3d 3d  llocatedUnused==
1aad0 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
1aae0 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
1aaf0 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
1ab00 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
1ab10 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
1ab20 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1ab30 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1ab40 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
1ab50 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
1ab60 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
1ab70 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
1ab80 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
1ab90 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
1aba0 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
1abb0 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
1abc0 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
1abd0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1abe0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
1abf0 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
1ac00 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
1ac10 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
1ac20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1ac30 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1ac40 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  amt);.      retu
1ac50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ac60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1ac70 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65  nt nCopy = pFile
1ac80 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
1ac90 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  set;.      memcp
1aca0 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
1acb0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1acc0 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43  on))[offset], nC
1acd0 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
1ace0 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
1acf0 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
1ad00 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
1ad10 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
1ad20 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
1ad30 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65  ndif..  got = se
1ad40 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
1ad50 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1ad60 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
1ad70 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
1ad80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ad90 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
1ada0 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72  {.    /* lastErr
1adb0 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
1adc0 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74  dRead */.    ret
1add0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1ade0 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1adf0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1ae00 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 20 20  no(pFile, 0);   
1ae10 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
1ae20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
1ae30 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
1ae40 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
1ae50 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
1ae60 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
1ae70 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
1ae80 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
1ae90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1aea0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1aeb0 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
1aec0 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65 6b 20  Attempt to seek 
1aed0 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72 69 70  the file-descrip
1aee0 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
1aef0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1af00 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20   to.** absolute 
1af10 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74 68 65  offset iOff, the
1af20 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  n attempt to wri
1af30 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
1af40 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42   data from.** pB
1af50 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61 6e 20  uf to it. If an 
1af60 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
1af70 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65 74 20  turn -1 and set 
1af80 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77  *piErrno. Otherw
1af90 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ise, .** return 
1afa0 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d 62 65  the actual numbe
1afb0 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1afc0 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  en (which may be
1afd0 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42   less than.** nB
1afe0 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uf)..*/.static i
1aff0 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  nt seekAndWriteF
1b000 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20  d(.  int fd,    
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b020 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
1b030 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69 74 65  criptor to write
1b040 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66   to */.  i64 iOf
1b050 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1b060 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1b070 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
1b080 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20   writing at */. 
1b090 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1b0a0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1b0b0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1b0c0 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72 20 74  om this buffer t
1b0d0 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  o the file */.  
1b0e0 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20 20 20  int nBuf,       
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
1b110 72 20 70 42 75 66 20 69 6e 20 62 79 74 65 73 20  r pBuf in bytes 
1b120 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72 72 6e  */.  int *piErrn
1b130 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
1b140 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
1b150 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65 72 72  or number if err
1b160 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a  or occurs */.){.
1b170 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1b1a0 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20 63 61  ned by system ca
1b1b0 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
1b1c0 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30 78 31   nBuf==(nBuf&0x1
1b1d0 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  ffff) );.  asser
1b1e0 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 61 73 73  t( fd>2 );.  ass
1b1f0 65 72 74 28 20 70 69 45 72 72 6e 6f 21 3d 30 20  ert( piErrno!=0 
1b200 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78 31  );.  nBuf &= 0x1
1b210 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54  ffff;.  TIMER_ST
1b220 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  ART;..#if define
1b230 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
1b240 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50  o{ rc = (int)osP
1b250 77 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20  write(fd, pBuf, 
1b260 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68  nBuf, iOff); }wh
1b270 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1b280 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c  no==EINTR );.#el
1b290 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1b2a0 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 72 63  READ64).  do{ rc
1b2b0 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65   = (int)osPwrite
1b2c0 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75  64(fd, pBuf, nBu
1b2d0 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65 28  f, iOff);}while(
1b2e0 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1b2f0 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20  EINTR);.#else.  
1b300 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53 65 65  do{.    i64 iSee
1b310 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69 4f  k = lseek(fd, iO
1b320 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  ff, SEEK_SET);. 
1b330 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1b340 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d 31 20 29  or( iSeek = -1 )
1b350 3b 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b 3c  ;.    if( iSeek<
1b360 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1b370 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  -1;.      break;
1b380 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1b390 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42 75 66  osWrite(fd, pBuf
1b3a0 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c  , nBuf);.  }whil
1b3b0 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
1b3c0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69  ==EINTR );.#endi
1b3d0 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  f..  TIMER_END;.
1b3e0 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
1b3f0 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
1b400 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20  ld %llu\n", fd, 
1b410 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f  rc, iOff, TIMER_
1b420 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20 69 66  ELAPSED));..  if
1b430 28 20 72 63 3c 30 20 29 20 2a 70 69 45 72 72 6e  ( rc<0 ) *piErrn
1b440 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74  o = errno;.  ret
1b450 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1b460 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
1b470 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73  fset in id->offs
1b480 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  et then read cnt
1b490 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
1b4a0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
1b4b0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1b4c0 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20  actually read.  
1b4d0 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65  Update the offse
1b4e0 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  t..**.** To avoi
1b4f0 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
1b500 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
1b510 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65  failed write the
1b520 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
1b530 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
1b540 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1b550 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
1b560 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65  ndWrite(unixFile
1b570 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *id, i64 offset
1b580 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
1b590 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
1b5a0 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57 72  return seekAndWr
1b5b0 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66  iteFd(id->h, off
1b5c0 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  set, pBuf, cnt, 
1b5d0 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b  &id->lastErrno);
1b5e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
1b5f0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
1b600 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
1b610 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1b620 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
1b630 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
1b640 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
1b650 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
1b660 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20  int unixWrite(. 
1b670 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
1b680 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  d, .  const void
1b690 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
1b6a0 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
1b6b0 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20  t64 offset .){. 
1b6c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1b6d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1b6e0 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20  ;.  int wrote = 
1b6f0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  0;.  assert( id 
1b700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
1b710 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
1b720 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
1b730 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
1b740 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
1b750 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
1b760 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
1b770 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
1b780 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
1b790 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
1b7a0 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
1b7b0 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
1b7c0 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65  le->pPreallocate
1b7d0 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  dUnused==0.     
1b7e0 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
1b7f0 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
1b800 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
1b810 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
1b820 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
1b830 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1b840 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  UG.  /* If we ar
1b850 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1b860 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1b870 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1b880 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f  posed to.  ** do
1b890 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1b8a0 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1b8b0 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1b8c0 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1b8d0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
1b8e0 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20  base file) then 
1b8f0 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
1b900 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1b910 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67  e.  ** has chang
1b920 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
1b930 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1b940 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63  is modified, rec
1b950 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61  ord that.  ** fa
1b960 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ct too..  */.  i
1b970 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1b980 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70  alWrite ){.    p
1b990 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
1b9a0 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61   1;  /* The data
1b9b0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
1b9c0 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66  dified */.    if
1b9d0 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20  ( offset<=24 && 
1b9e0 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29  offset+amt>=27 )
1b9f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1ba00 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e        char oldCn
1ba10 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d  tr[4];.      Sim
1ba20 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1ba30 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1ba40 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
1ba50 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72  ile, 24, oldCntr
1ba60 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  , 4);.      Simu
1ba70 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1ba80 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
1ba90 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28  rc!=4 || memcmp(
1baa0 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72  oldCntr, &((char
1bab0 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65  *)pBuf)[24-offse
1bac0 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20  t], 4)!=0 ){.   
1bad0 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e       pFile->tran
1bae0 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20  sCntrChng = 1;  
1baf0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1bb00 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63  on counter has c
1bb10 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  hanged */.      
1bb20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1bb30 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
1bb40 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44  SQLITE_MMAP_READ
1bb50 57 52 49 54 45 29 20 26 26 20 53 51 4c 49 54 45  WRITE) && SQLITE
1bb60 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1bb70 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
1bb80 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
1bb90 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73  write request as
1bba0 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
1bbb0 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
1bbc0 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
1bbd0 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
1bbe0 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
1bbf0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
1bc00 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1bc10 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
1bc20 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
1bc30 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
1bc40 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
1bc50 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1bc60 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
1bc70 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
1bc80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bc90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bca0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c  int nCopy = pFil
1bcb0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
1bcc0 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fset;.      memc
1bcd0 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
1bce0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1bcf0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
1bd00 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
1bd10 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
1bd20 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
1bd30 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
1bd40 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
1bd50 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
1bd60 65 6e 64 69 66 0a 20 0a 20 20 77 68 69 6c 65 28  endif. .  while(
1bd70 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e   (wrote = seekAn
1bd80 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66  dWrite(pFile, of
1bd90 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1bda0 29 3c 61 6d 74 20 26 26 20 77 72 6f 74 65 3e 30  )<amt && wrote>0
1bdb0 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
1bdc0 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
1bdd0 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
1bde0 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
1bdf0 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
1be00 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1be10 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
1be20 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
1be30 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1be40 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
1be50 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61  t=1 ));..  if( a
1be60 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20 20 20 20  mt>wrote ){.    
1be70 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70  if( wrote<0 && p
1be80 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21  File->lastErrno!
1be90 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20  =ENOSPC ){.     
1bea0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1beb0 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  t by seekAndWrit
1bec0 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
1bed0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1bee0 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
1bef0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
1bf00 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b  Errno(pFile, 0);
1bf10 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
1bf20 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
1bf30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1bf40 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LL;.    }.  }.. 
1bf50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bf60 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
1bf70 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
1bf80 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1bf90 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
1bfa0 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
1bfb0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
1bfc0 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
1bfd0 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
1bfe0 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61   are occurring a
1bff0 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
1c000 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1c010 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
1c020 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
1c030 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
1c040 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1c050 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20  We do not trust 
1c060 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69  systems to provi
1c070 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61  de a working fda
1c080 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20  tasync().  Some 
1c090 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f  do..** Others do
1c0a0 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65   no.  To be safe
1c0b0 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20  , we will stick 
1c0c0 77 69 74 68 20 74 68 65 20 28 73 6c 69 67 68 74  with the (slight
1c0d0 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73  ly slower).** fs
1c0e0 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e  ync(). If you kn
1c0f0 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79 73  ow that your sys
1c100 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74  tem does support
1c110 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72   fdatasync() cor
1c120 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20  rectly,.** then 
1c130 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77  simply compile w
1c140 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d  ith -Dfdatasync=
1c150 66 64 61 74 61 73 79 6e 63 20 6f 72 20 2d 44 48  fdatasync or -DH
1c160 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 2a 2f  AVE_FDATASYNC.*/
1c170 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64  .#if !defined(fd
1c180 61 74 61 73 79 6e 63 29 20 26 26 20 21 48 41 56  atasync) && !HAV
1c190 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65  E_FDATASYNC.# de
1c1a0 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
1c1b0 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
1c1c0 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
1c1d0 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
1c1e0 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
1c1f0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
1c200 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
1c210 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
1c220 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
1c230 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1c240 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
1c250 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
1c260 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
1c270 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
1c280 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
1c290 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1c2a0 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
1c2b0 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1c2c0 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
1c2d0 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
1c2e0 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
1c2f0 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
1c300 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
1c310 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
1c320 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1c330 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
1c340 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
1c350 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
1c360 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
1c370 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
1c380 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
1c390 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
1c3a0 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
1c3b0 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
1c3c0 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
1c3d0 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
1c3e0 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
1c3f0 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
1c400 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
1c410 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
1c420 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
1c430 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
1c440 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
1c450 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
1c460 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
1c470 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
1c480 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
1c490 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
1c4a0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1c4b0 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
1c4c0 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
1c4d0 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1c4e0 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
1c4f0 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
1c500 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
1c510 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
1c520 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
1c530 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
1c540 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
1c550 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
1c560 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
1c570 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
1c580 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
1c590 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
1c5a0 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
1c5b0 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
1c5c0 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
1c5d0 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
1c5e0 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1c5f0 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
1c600 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
1c610 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
1c620 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
1c630 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
1c640 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
1c650 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
1c660 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
1c670 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
1c680 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
1c690 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
1c6a0 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
1c6b0 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
1c6c0 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
1c6d0 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
1c6e0 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
1c6f0 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
1c700 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
1c710 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
1c720 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
1c730 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
1c740 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
1c750 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
1c760 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
1c770 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
1c780 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
1c790 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
1c7a0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1c7b0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1c7c0 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1c7d0 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
1c7e0 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
1c7f0 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
1c800 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
1c810 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
1c820 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1c830 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
1c840 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
1c850 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
1c860 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
1c870 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
1c880 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
1c890 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
1c8a0 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
1c8b0 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
1c8c0 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
1c8d0 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
1c8e0 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
1c8f0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1c900 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1c910 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
1c920 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1c930 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1c940 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1c950 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
1c960 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
1c970 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1c980 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
1c990 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1c9a0 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1c9b0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1c9c0 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
1c9d0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
1c9e0 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
1c9f0 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
1ca00 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
1ca10 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
1ca20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
1ca30 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
1ca40 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1ca50 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
1ca60 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
1ca70 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
1ca80 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
1ca90 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1caa0 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
1cab0 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1cac0 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
1cad0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
1cae0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1caf0 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
1cb00 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
1cb10 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
1cb20 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
1cb30 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 67  ** no-op.  But g
1cb40 6f 20 61 68 65 61 64 20 61 6e 64 20 63 61 6c 6c  o ahead and call
1cb50 20 66 73 74 61 74 28 29 20 74 6f 20 76 61 6c 69   fstat() to vali
1cb60 64 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  date the file.  
1cb70 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 73  ** descriptor as
1cb80 20 77 65 20 6e 65 65 64 20 61 20 6d 65 74 68 6f   we need a metho
1cb90 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20 61 20 66  d to provoke a f
1cba0 61 69 6c 75 72 65 20 64 75 72 69 6e 67 0a 20 20  ailure during.  
1cbb0 2a 2a 20 63 6f 76 65 72 61 74 65 20 74 65 73 74  ** coverate test
1cbc0 69 6e 67 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ing..  */.#ifdef
1cbd0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1cbe0 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73    {.    struct s
1cbf0 74 61 74 20 62 75 66 3b 0a 20 20 20 20 72 63 20  tat buf;.    rc 
1cc00 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 62  = osFstat(fd, &b
1cc10 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 48  uf);.  }.#elif H
1cc20 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
1cc30 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  if( fullSync ){.
1cc40 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
1cc50 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
1cc60 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1cc70 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
1cc80 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
1cc90 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
1cca0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
1ccb0 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
1ccc0 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
1ccd0 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
1cce0 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
1ccf0 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
1cd00 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
1cd10 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
1cd20 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
1cd30 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
1cd40 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
1cd50 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
1cd60 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
1cd70 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
1cd80 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
1cd90 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
1cda0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
1cdb0 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
1cdc0 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
1cdd0 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
1cde0 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
1cdf0 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
1ce00 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
1ce10 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
1ce20 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
1ce30 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
1ce40 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
1ce50 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
1ce60 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1ce70 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
1ce80 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
1ce90 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
1cea0 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
1ceb0 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
1cec0 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
1ced0 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
1cee0 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
1cef0 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
1cf00 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
1cf10 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
1cf20 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
1cf30 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
1cf40 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
1cf50 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
1cf60 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
1cf70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
1cf80 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
1cf90 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
1cfa0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
1cfb0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1cfc0 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
1cfd0 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
1cfe0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
1cff0 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
1d000 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1d010 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d020 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
1d030 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
1d040 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1d050 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
1d060 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
1d070 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
1d080 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
1d090 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
1d0a0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
1d0b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1d0c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1d0d0 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
1d0e0 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
1d0f0 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
1d100 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
1d110 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
1d120 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
1d130 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63  .**.** The direc
1d140 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
1d150 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72  ptor is used for
1d160 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20   only one thing 
1d170 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20  - to.** fsync() 
1d180 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d  a directory to m
1d190 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63 72  ake sure file cr
1d1a0 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74  eation and delet
1d1b0 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72  ion events.** ar
1d1c0 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
1d1d0 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73 20  k.  Such fsyncs 
1d1e0 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f  are not needed o
1d1f0 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e  n newer.** journ
1d200 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d  aling filesystem
1d210 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75 69  s, but are requi
1d220 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c  red on older fil
1d230 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20  esystems..**.** 
1d240 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1d250 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75   be overridden u
1d260 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79 73  sing the xSetSys
1d270 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a  Call interface..
1d280 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74  ** The ability t
1d290 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
1d2a0 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64 65  routine was adde
1d2b0 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20  d in support of 
1d2c0 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20  the.** chromium 
1d2d0 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e  sandbox.  Openin
1d2e0 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 73  g a directory is
1d2f0 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73 6b   a security risk
1d300 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64   (we are.** told
1d310 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f  ) so making it o
1d320 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f  verrideable allo
1d330 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20  ws the chromium 
1d340 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65  sandbox to.** re
1d350 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74 69  place this routi
1d360 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65  ne with a harmle
1d370 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61  ss no-op.  To ma
1d380 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
1d390 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c  ** a no-op, repl
1d3a0 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73 74  ace it with a st
1d3b0 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ub that returns 
1d3c0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1d3d0 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74  aves.** *pFd set
1d3e0 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e   to a negative n
1d3f0 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  umber..**.** If 
1d400 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1d410 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
1d420 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1d430 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20   for closing.** 
1d440 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1d450 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63  tor *pFd using c
1d460 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lose()..*/.stati
1d470 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
1d480 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
1d490 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a  zFilename, int *
1d4a0 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  pFd){.  int ii;.
1d4b0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
1d4c0 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d   char zDirname[M
1d4d0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
1d4e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1d4f0 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
1d500 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22  , zDirname, "%s"
1d510 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1d520 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c  for(ii=(int)strl
1d530 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69  en(zDirname); ii
1d540 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69  >0 && zDirname[i
1d550 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a  i]!='/'; ii--);.
1d560 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20    if( ii>0 ){.  
1d570 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d    zDirname[ii] =
1d580 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a   '\0';.  }else{.
1d590 20 20 20 20 69 66 28 20 7a 44 69 72 6e 61 6d 65      if( zDirname
1d5a0 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44 69 72 6e  [0]!='/' ) zDirn
1d5b0 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b 0a 20 20  ame[0] = '.';.  
1d5c0 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d 20 3d 20    zDirname[1] = 
1d5d0 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f  0;.  }.  fd = ro
1d5e0 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61  bust_open(zDirna
1d5f0 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
1d600 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 69 66 28  INARY, 0);.  if(
1d610 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53   fd>=0 ){.    OS
1d620 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20  TRACE(("OPENDIR 
1d630 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20  %-3d %s\n", fd, 
1d640 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 7d 0a  zDirname));.  }.
1d650 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 69    *pFd = fd;.  i
1d660 66 28 20 66 64 3e 3d 30 20 29 20 72 65 74 75 72  f( fd>=0 ) retur
1d670 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72  n SQLITE_OK;.  r
1d680 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1d690 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
1d6a0 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 44 69  EN_BKPT, "openDi
1d6b0 72 65 63 74 6f 72 79 22 2c 20 7a 44 69 72 6e 61  rectory", zDirna
1d6c0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  me);.}../*.** Ma
1d6d0 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
1d6e0 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
1d6f0 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
1d700 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
1d710 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
1d720 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
1d730 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
1d740 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
1d750 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
1d760 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
1d770 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
1d780 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
1d790 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
1d7a0 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
1d7b0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
1d7c0 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
1d7d0 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
1d7e0 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1d7f0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
1d800 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
1d810 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
1d820 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
1d830 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
1d840 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
1d850 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
1d860 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
1d870 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
1d880 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
1d890 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1d8a0 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
1d8b0 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
1d8c0 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
1d8d0 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
1d8e0 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
1d8f0 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
1d900 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
1d910 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
1d920 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1d930 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
1d940 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
1d950 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
1d960 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
1d970 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
1d980 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
1d990 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
1d9a0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
1d9b0 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71   int unixSync(sq
1d9c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1d9d0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
1d9e0 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
1d9f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1da00 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20  ile*)id;..  int 
1da10 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c  isDataOnly = (fl
1da20 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ags&SQLITE_SYNC_
1da30 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  DATAONLY);.  int
1da40 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66   isFullsync = (f
1da50 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1da60 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20  TE_SYNC_FULL;.. 
1da70 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
1da80 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
1da90 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
1daa0 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
1dab0 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
1dac0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1dad0 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
1dae0 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
1daf0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1db00 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
1db10 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
1db20 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
1db30 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1db40 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
1db50 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
1db60 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
1db70 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
1db80 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1db90 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1dba0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
1dbb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1dbc0 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  L );..  assert( 
1dbd0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
1dbe0 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE(("SYNC    %-3
1dbf0 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
1dc00 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
1dc10 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
1dc20 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
1dc30 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
1dc40 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1dc50 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1dc60 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1dc70 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
1dc80 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1dc90 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1dca0 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c  OERR_FSYNC, "ful
1dcb0 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d  l_fsync", pFile-
1dcc0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20  >zPath);.  }..  
1dcd0 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74 68  /* Also fsync th
1dce0 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1dcf0 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  aining the file 
1dd00 69 66 20 74 68 65 20 44 49 52 53 59 4e 43 20 66  if the DIRSYNC f
1dd10 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e  lag.  ** is set.
1dd20 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65 2d    This is a one-
1dd30 74 69 6d 65 20 6f 63 63 75 72 72 65 6e 63 65 2e  time occurrence.
1dd40 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20 28    Many systems (
1dd50 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20  examples: AIX). 
1dd60 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20 74   ** are unable t
1dd70 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65 63 74  o fsync a direct
1dd80 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65  ory, so ignore e
1dd90 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73 79  rrors on the fsy
1dda0 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nc..  */.  if( p
1ddb0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1ddc0 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  & UNIXFILE_DIRSY
1ddd0 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69  NC ){.    int di
1dde0 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rfd;.    OSTRACE
1ddf0 28 28 22 44 49 52 53 59 4e 43 20 25 73 20 28 68  (("DIRSYNC %s (h
1de00 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64  ave_fullfsync=%d
1de10 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22   fullsync=%d)\n"
1de20 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a  , pFile->zPath,.
1de30 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45              HAVE
1de40 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75  _FULLFSYNC, isFu
1de50 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72 63  llsync));.    rc
1de60 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f   = osOpenDirecto
1de70 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  ry(pFile->zPath,
1de80 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66   &dirfd);.    if
1de90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1dea0 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73  ){.      full_fs
1deb0 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29  ync(dirfd, 0, 0)
1dec0 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
1ded0 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66  lose(pFile, dirf
1dee0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
1def0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1df00 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1df10 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20  E_CANTOPEN );.  
1df20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1df30 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OK;.    }.    pF
1df40 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1df50 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53  = ~UNIXFILE_DIRS
1df60 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  YNC;.  }.  retur
1df70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1df80 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
1df90 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
1dfa0 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
1dfb0 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63  ic int unixTrunc
1dfc0 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
1dfd0 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29   *id, i64 nByte)
1dfe0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1dff0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
1e000 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)id;.  int rc;.
1e010 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1e020 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1e030 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1e040 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1e050 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  TE );..  /* If t
1e060 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
1e070 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
1e080 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
1e090 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
1e0a0 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
1e0b0 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
1e0c0 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
1e0d0 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
1e0e0 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
1e0f0 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
1e100 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
1e110 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
1e120 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
1e130 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
1e140 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1e150 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
1e160 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
1e170 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
1e180 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
1e190 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
1e1a0 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
1e1b0 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75  rc = robust_ftru
1e1c0 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1e1d0 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63  nByte);.  if( rc
1e1e0 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
1e1f0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
1e200 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
1e210 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1e220 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1e230 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1e240 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1e250 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66  .  }else{.#ifdef
1e260 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1e270 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1e280 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1e290 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1e2a0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1e2b0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69  ed to.    ** doi
1e2c0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
1e2d0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
1e2e0 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
1e2f0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
1e300 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74     ** normal dat
1e310 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20  abase file) and 
1e320 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  we truncate the 
1e330 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
1e340 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74  gth,.    ** that
1e350 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64   effectively upd
1e360 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20  ates the change 
1e370 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d  counter.  This m
1e380 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20  ight happen.    
1e390 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e  ** when restorin
1e3a0 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
1e3b0 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  ng the backup AP
1e3c0 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65  I from a zero-le
1e3d0 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72  ngth.    ** sour
1e3e0 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
1e3f0 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1e400 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65  alWrite && nByte
1e410 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ==0 ){.      pFi
1e420 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
1e430 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  g = 1;.    }.#en
1e440 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
1e450 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1e460 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
1e470 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72 75 6e  le was just trun
1e480 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20  cated to a size 
1e490 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
1e4a0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a   currently.    *
1e4b0 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c  * mapped region,
1e4c0 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
1e4d0 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69  ctive mapping si
1e4e0 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69  ze as well. SQLi
1e4f0 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75  te will.    ** u
1e500 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72  se read() and wr
1e510 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20  ite() to access 
1e520 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73  data beyond this
1e530 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20   point from now 
1e540 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  on.  .    */.   
1e550 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c 65   if( nByte<pFile
1e560 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1e570 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1e580 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ize = nByte;.   
1e590 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72   }.#endif..    r
1e5a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e5b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1e5c0 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
1e5d0 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
1e5e0 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
1e5f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1e600 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
1e610 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
1e620 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1e630 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1e640 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
1e650 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  );.  rc = osFsta
1e660 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  t(((unixFile*)id
1e670 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53  )->h, &buf);.  S
1e680 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1e690 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1e6a0 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65  !=0 ){.    store
1e6b0 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46  LastErrno((unixF
1e6c0 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b  ile*)id, errno);
1e6d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e6e0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
1e6f0 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62    }.  *pSize = b
1e700 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f  uf.st_size;..  /
1e710 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
1e720 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62   zero-size datab
1e730 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f  ase, the findIno
1e740 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75  deInfo() procedu
1e750 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61  re.  ** writes a
1e760 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74   single byte int
1e770 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f  o that file in o
1e780 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f  rder to work aro
1e790 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69  und a bug.  ** i
1e7a0 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73  n the OS-X msdos
1e7b0 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e   filesystem.  In
1e7c0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
1e7d0 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70  problems with up
1e7e0 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c  per.  ** layers,
1e7f0 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f   we need to repo
1e800 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a  rt this file siz
1e810 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74  e as zero even t
1e820 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a  hough it is.  **
1e830 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63   really 1.   Tic
1e840 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a  ket #3260..  */.
1e850 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20    if( *pSize==1 
1e860 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a  ) *pSize = 0;...
1e870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e880 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
1e890 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1e8a0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1e8b0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
1e8c0 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70  ** Handler for p
1e8d0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c  roxy-locking fil
1e8e0 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e  e-control verbs.
1e8f0 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20    Defined below 
1e900 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69  in the.** proxyi
1e910 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73  ng locking divis
1e920 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1e930 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  nt proxyFileCont
1e940 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1e950 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65  *,int,void*);.#e
1e960 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  ndif../* .** Thi
1e970 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e980 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  lled to handle t
1e990 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
1e9a0 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69  SIZE_HINT .** fi
1e9b0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61  le-control opera
1e9c0 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74  tion.  Enlarge t
1e9d0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e  he database to n
1e9e0 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a  Bytes in size.**
1e9f0 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20   (rounded up to 
1ea00 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73  the next chunk-s
1ea10 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64 61  ize).  If the da
1ea20 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
1ea30 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c  y.** nBytes or l
1ea40 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74  arger, this rout
1ea50 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1ea60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63  */.static int fc
1ea70 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78  ntlSizeHint(unix
1ea80 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34  File *pFile, i64
1ea90 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70   nByte){.  if( p
1eaa0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
1eab0 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65  ){.    i64 nSize
1eac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ead0 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
1eae0 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
1eaf0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1eb00 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1eb10 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20  /* Used to hold 
1eb20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66  return values of
1eb30 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a   fstat() */.   .
1eb40 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
1eb50 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20  pFile->h, &buf) 
1eb60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1eb70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1eb80 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  AT;.    }..    n
1eb90 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70  Size = ((nByte+p
1eba0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29  File->szChunk-1)
1ebb0 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   / pFile->szChun
1ebc0 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
1ebd0 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  unk;.    if( nSi
1ebe0 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73  ze>(i64)buf.st_s
1ebf0 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69  ize ){..#if defi
1ec00 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
1ec10 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
1ec20 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
1ec30 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  E.      /* The c
1ec40 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e  ode below is han
1ec50 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  dling the return
1ec60 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c   value of osFall
1ec70 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a  ocate() .      *
1ec80 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73  * correctly. pos
1ec90 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69  ix_fallocate() i
1eca0 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65  s defined to "re
1ecb0 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75  turns zero on su
1ecc0 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a  ccess, .      **
1ecd0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d   or an error num
1ece0 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22  ber on  failure"
1ecf0 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67  . See the manpag
1ed00 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  e for details. *
1ed10 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b  /.      int err;
1ed20 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
1ed30 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f     err = osFallo
1ed40 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62  cate(pFile->h, b
1ed50 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a  uf.st_size, nSiz
1ed60 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a  e-buf.st_size);.
1ed70 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72        }while( er
1ed80 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  r==EINTR );.    
1ed90 20 20 69 66 28 20 65 72 72 20 26 26 20 65 72 72    if( err && err
1eda0 21 3d 45 49 4e 56 41 4c 20 29 20 72 65 74 75 72  !=EINVAL ) retur
1edb0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1edc0 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RITE;.#else.    
1edd0 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64    /* If the OS d
1ede0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73  oes not have pos
1edf0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20  ix_fallocate(), 
1ee00 66 61 6b 65 20 69 74 2e 20 57 72 69 74 65 20 61  fake it. Write a
1ee10 20 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c   .      ** singl
1ee20 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 6c 61  e byte to the la
1ee30 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20  st byte in each 
1ee40 62 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c 73  block that falls
1ee50 20 65 6e 74 69 72 65 6c 79 0a 20 20 20 20 20 20   entirely.      
1ee60 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 65 78  ** within the ex
1ee70 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54  tended region. T
1ee80 68 65 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64  hen, if required
1ee90 2c 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  , a single byte.
1eea0 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
1eeb0 65 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f  et (nSize-1), to
1eec0 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   set the size of
1eed0 20 74 68 65 20 66 69 6c 65 20 63 6f 72 72 65 63   the file correc
1eee0 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  tly..      ** Th
1eef0 69 73 20 69 73 20 61 20 73 69 6d 69 6c 61 72 20  is is a similar 
1ef00 74 65 63 68 6e 69 71 75 65 20 74 6f 20 74 68 61  technique to tha
1ef10 74 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20  t used by glibc 
1ef20 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20 20 20 20  on systems.     
1ef30 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20   ** that do not 
1ef40 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c  have a real fall
1ef50 6f 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20  ocate() call..  
1ef60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
1ef70 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62   nBlk = buf.st_b
1ef80 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65  lksize;  /* File
1ef90 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69  -system block si
1efa0 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ze */.      int 
1efb0 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20  nWrite = 0;     
1efc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1efd0 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1efe0 65 6e 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69  en by seekAndWri
1eff0 74 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  te */.      i64 
1f000 69 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  iWrite;         
1f010 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1f020 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  offset to write 
1f030 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 57 72  to */..      iWr
1f040 69 74 65 20 3d 20 28 62 75 66 2e 73 74 5f 73 69  ite = (buf.st_si
1f050 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 20 2b 20  ze/nBlk)*nBlk + 
1f060 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20 20 20 20 20  nBlk - 1;.      
1f070 61 73 73 65 72 74 28 20 69 57 72 69 74 65 3e 3d  assert( iWrite>=
1f080 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20  buf.st_size );. 
1f090 20 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69       assert( ((i
1f0a0 57 72 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d  Write+1)%nBlk)==
1f0b0 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f  0 );.      for(/
1f0c0 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65  *no-op*/; iWrite
1f0d0 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d 31 3b 20 69  <nSize+nBlk-1; i
1f0e0 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20  Write+=nBlk ){. 
1f0f0 20 20 20 20 20 20 20 69 66 28 20 69 57 72 69 74         if( iWrit
1f100 65 3e 3d 6e 53 69 7a 65 20 29 20 69 57 72 69 74  e>=nSize ) iWrit
1f110 65 20 3d 20 6e 53 69 7a 65 20 2d 20 31 3b 0a 20  e = nSize - 1;. 
1f120 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20         nWrite = 
1f130 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1f140 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20  le, iWrite, "", 
1f150 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1f160 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75  nWrite!=1 ) retu
1f170 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1f180 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23  WRITE;.      }.#
1f190 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1f1a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1f1b0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
1f1c0 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
1f1d0 65 4d 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e  eMax>0 && nByte>
1f1e0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1f1f0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1f200 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a     if( pFile->sz
1f210 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20  Chunk<=0 ){.    
1f220 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1f230 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1f240 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20   nByte) ){.     
1f250 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1f260 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
1f270 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f280 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1f290 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1f2a0 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
1f2b0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1f2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f2d0 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66     rc = unixMapf
1f2e0 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
1f2f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1f300 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1f310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
1f330 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  Arg is initially
1f340 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74   negative then t
1f350 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20  his is a query. 
1f360 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a   Set *pArg to.**
1f370 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e   1 or 0 dependin
1f380 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1f390 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20  not bit mask of 
1f3a0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1f3b0 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49   is set..**.** I
1f3c0 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20  f *pArg is 0 or 
1f3d0 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72  1, then clear or
1f3e0 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69   set the mask bi
1f3f0 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  t of pFile->ctrl
1f400 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Flags..*/.static
1f410 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69   void unixModeBi
1f420 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
1f430 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
1f440 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67   mask, int *pArg
1f450 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30  ){.  if( *pArg<0
1f460 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20   ){.    *pArg = 
1f470 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
1f480 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  s & mask)!=0;.  
1f490 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67  }else if( (*pArg
1f4a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  )==0 ){.    pFil
1f4b0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1f4c0 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ~mask;.  }else{.
1f4d0 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
1f4e0 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
1f4f0 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
1f500 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
1f510 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
1f520 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
1f530 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b  uf, char *zBuf);
1f540 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
1f550 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
1f560 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
1f570 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
1f580 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
1f590 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1f5a0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
1f5b0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75  void *pArg){.  u
1f5c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1f5d0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1f5e0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1f5f0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69  #if defined(__li
1f600 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65  nux__) && define
1f610 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1f620 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49  BATCH_ATOMIC_WRI
1f630 54 45 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  TE).    case SQL
1f640 49 54 45 5f 46 43 4e 54 4c 5f 42 45 47 49 4e 5f  ITE_FCNTL_BEGIN_
1f650 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a  ATOMIC_WRITE: {.
1f660 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f        int rc = o
1f670 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sIoctl(pFile->h,
1f680 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f   F2FS_IOC_START_
1f690 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20  ATOMIC_WRITE);. 
1f6a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
1f6b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 45   SQLITE_IOERR_BE
1f6c0 47 49 4e 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c  GIN_ATOMIC : SQL
1f6d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1f6e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1f6f0 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  NTL_COMMIT_ATOMI
1f700 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  C_WRITE: {.     
1f710 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74   int rc = osIoct
1f720 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53  l(pFile->h, F2FS
1f730 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d  _IOC_COMMIT_ATOM
1f740 49 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20  IC_WRITE);.     
1f750 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
1f760 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4d 4d 49 54  ITE_IOERR_COMMIT
1f770 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45  _ATOMIC : SQLITE
1f780 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1f790 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f7a0 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43  _ROLLBACK_ATOMIC
1f7b0 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  _WRITE: {.      
1f7c0 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c  int rc = osIoctl
1f7d0 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f  (pFile->h, F2FS_
1f7e0 49 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41 54 49  IOC_ABORT_VOLATI
1f7f0 4c 45 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20  LE_WRITE);.     
1f800 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
1f810 49 54 45 5f 49 4f 45 52 52 5f 52 4f 4c 4c 42 41  ITE_IOERR_ROLLBA
1f820 43 4b 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49  CK_ATOMIC : SQLI
1f830 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
1f840 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f  dif /* __linux__
1f850 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
1f860 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57  E_BATCH_ATOMIC_W
1f870 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20 63 61 73  RITE */..    cas
1f880 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
1f890 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
1f8a0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
1f8b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1f8c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1f8d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1f8e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f8f0 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f  FCNTL_LAST_ERRNO
1f900 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1f910 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
1f920 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
1f930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f950 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
1f960 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
1f970 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
1f980 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
1f990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f9a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1f9b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f9c0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
1f9d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1f9e0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1f9f0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1fa00 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c        rc = fcntl
1fa10 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20  SizeHint(pFile, 
1fa20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
1fa30 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1fa40 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1fa50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fa60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1fa70 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
1fa80 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
1fa90 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
1faa0 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  le, UNIXFILE_PER
1fab0 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
1fac0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1fad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1fae0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1faf0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
1fb00 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
1fb10 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1fb20 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1fb30 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
1fb40 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1fb50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1fb60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1fb70 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
1fb80 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
1fb90 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
1fba0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1fbb0 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
1fbc0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
1fbd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1fbe0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1fbf0 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
1fc00 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  ILENAME: {.     
1fc10 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20   char *zTFile = 
1fc20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1fc30 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  ( pFile->pVfs->m
1fc40 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20  xPathname );.   
1fc50 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b     if( zTFile ){
1fc60 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65 74  .        unixGet
1fc70 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
1fc80 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1fc90 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20  , zTFile);.     
1fca0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
1fcb0 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
1fcc0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1fcd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1fce0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1fcf0 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
1fd00 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1fd10 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d  )pArg = fileHasM
1fd20 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  oved(pFile);.   
1fd30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fd40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  _OK;.    }.#ifde
1fd50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1fd60 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20 20  SETLK_TIMEOUT.  
1fd70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1fd80 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54  NTL_LOCK_TIMEOUT
1fd90 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  : {.      pFile-
1fda0 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  >iBusyTimeout = 
1fdb0 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20  *(int*)pArg;.   
1fdc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fdd0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
1fde0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
1fdf0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
1fe00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1fe10 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
1fe20 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
1fe30 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
1fe40 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
1fe50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1fe60 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73    if( newLimit>s
1fe70 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1fe80 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20  ig.mxMmap ){.   
1fe90 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
1fea0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1feb0 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  fig.mxMmap;.    
1fec0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68    }..      /* Th
1fed0 65 20 76 61 6c 75 65 20 6f 66 20 6e 65 77 4c 69  e value of newLi
1fee0 6d 69 74 20 6d 61 79 20 62 65 20 65 76 65 6e 74  mit may be event
1fef0 75 61 6c 6c 79 20 63 61 73 74 20 74 6f 20 28 73  ually cast to (s
1ff00 69 7a 65 5f 74 29 20 61 6e 64 20 70 61 73 73 65  ize_t) and passe
1ff10 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 6d  d.      ** to mm
1ff20 61 70 28 29 2e 20 52 65 73 74 72 69 63 74 20 69  ap(). Restrict i
1ff30 74 73 20 76 61 6c 75 65 20 74 6f 20 32 47 42 20  ts value to 2GB 
1ff40 69 66 20 28 73 69 7a 65 5f 74 29 20 69 73 20 6e  if (size_t) is n
1ff50 6f 74 20 61 74 20 6c 65 61 73 74 20 61 0a 20 20  ot at least a.  
1ff60 20 20 20 20 2a 2a 20 36 34 2d 62 69 74 20 74 79      ** 64-bit ty
1ff70 70 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  pe. */.      if(
1ff80 20 6e 65 77 4c 69 6d 69 74 3e 30 20 26 26 20 73   newLimit>0 && s
1ff90 69 7a 65 6f 66 28 73 69 7a 65 5f 74 29 3c 38 20  izeof(size_t)<8 
1ffa0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69  ){.        newLi
1ffb0 6d 69 74 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20  mit = (newLimit 
1ffc0 26 20 30 78 37 46 46 46 46 46 46 46 29 3b 0a 20  & 0x7FFFFFFF);. 
1ffd0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28       }..      *(
1ffe0 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  i64*)pArg = pFil
1fff0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  e->mmapSizeMax;.
20000 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
20010 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69  it>=0 && newLimi
20020 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t!=pFile->mmapSi
20030 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e  zeMax && pFile->
20040 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a  nFetchOut==0 ){.
20050 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d          pFile->m
20060 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77  mapSizeMax = new
20070 4c 69 6d 69 74 3b 0a 23 69 66 64 65 66 20 53 51  Limit;.#ifdef SQ
20080 4c 49 54 45 5f 53 48 41 52 45 44 5f 4d 41 50 50  LITE_SHARED_MAPP
20090 49 4e 47 0a 20 20 20 20 20 20 20 20 69 66 28 20  ING.        if( 
200a0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3d 3d 30  pFile->pInode==0
200b0 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
200c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
200d0 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20  pSize>0 ){.     
200e0 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69       unixUnmapfi
200f0 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  le(pFile);.     
20100 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61       rc = unixMa
20110 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29  pfile(pFile, -1)
20120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20130 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
20140 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   rc;.    }.#endi
20150 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
20160 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65  DEBUG.    /* The
20170 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69   pager calls thi
20180 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e  s method to sign
20190 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64  al that it has d
201a0 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c  one.    ** a rol
201b0 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74  lback and that t
201c0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74  he database is t
201d0 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67  herefore unchang
201e0 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74  ed and.    ** it
201f0 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20   hence it is OK 
20200 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  for the transact
20210 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ion change count
20220 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  er to be.    ** 
20230 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a  unchanged..    *
20240 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
20250 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
20260 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28  NGED: {.      ((
20270 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64  unixFile*)id)->d
20280 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
20290 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
202a0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
202b0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
202c0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
202d0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
202e0 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65  PPLE__).    case
202f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
20300 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
20310 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20320 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50  _FCNTL_GET_LOCKP
20330 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
20340 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69    return proxyFi
20350 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c  leControl(id,op,
20360 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pArg);.    }.#en
20370 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
20380 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
20390 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
203a0 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a  APPLE__) */.  }.
203b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
203c0 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a  NOTFOUND;.}../*.
203d0 2a 2a 20 49 66 20 70 46 64 2d 3e 73 65 63 74 6f  ** If pFd->secto
203e0 72 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  rSize is non-zer
203f0 6f 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  o when this func
20400 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
20410 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  it is a.** no-op
20420 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
20430 20 76 61 6c 75 65 73 20 6f 66 20 70 46 64 2d 3e   values of pFd->
20440 73 65 63 74 6f 72 53 69 7a 65 20 61 6e 64 20 0a  sectorSize and .
20450 2a 2a 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68  ** pFd->deviceCh
20460 61 72 61 63 74 65 72 69 73 74 69 63 73 20 61 72  aracteristics ar
20470 65 20 73 65 74 20 61 63 63 6f 72 64 69 6e 67 20  e set according 
20480 74 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  to the file-syst
20490 65 6d 20 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  em .** character
204a0 69 73 74 69 63 73 2e 20 0a 2a 2a 0a 2a 2a 20 54  istics. .**.** T
204b0 68 65 72 65 20 61 72 65 20 74 77 6f 20 76 65 72  here are two ver
204c0 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75  sions of this fu
204d0 6e 63 74 69 6f 6e 2e 20 4f 6e 65 20 66 6f 72 20  nction. One for 
204e0 51 4e 58 20 61 6e 64 20 6f 6e 65 20 66 6f 72 20  QNX and one for 
204f0 61 6c 6c 0a 2a 2a 20 6f 74 68 65 72 20 73 79 73  all.** other sys
20500 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
20510 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 73 74 61 74   __QNXNTO__.stat
20520 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69 63  ic void setDevic
20530 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
20540 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
20550 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
20560 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20570 73 74 69 63 73 3d 3d 30 20 7c 7c 20 70 46 64 2d  stics==0 || pFd-
20580 3e 73 65 63 74 6f 72 53 69 7a 65 21 3d 30 20 29  >sectorSize!=0 )
20590 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 73 65 63  ;.  if( pFd->sec
205a0 74 6f 72 53 69 7a 65 3d 3d 30 20 29 7b 0a 23 69  torSize==0 ){.#i
205b0 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  f defined(__linu
205c0 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  x__) && defined(
205d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41  SQLITE_ENABLE_BA
205e0 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  TCH_ATOMIC_WRITE
205f0 29 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ).    int res;. 
20600 20 20 20 75 33 32 20 66 20 3d 20 30 3b 0a 0a 20     u32 f = 0;.. 
20610 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
20620 73 75 70 70 6f 72 74 20 66 6f 72 20 46 32 46 53  support for F2FS
20630 20 61 74 6f 6d 69 63 20 62 61 74 63 68 20 77 72   atomic batch wr
20640 69 74 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65 73  ites. */.    res
20650 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 64 2d 3e   = osIoctl(pFd->
20660 68 2c 20 46 32 46 53 5f 49 4f 43 5f 47 45 54 5f  h, F2FS_IOC_GET_
20670 46 45 41 54 55 52 45 53 2c 20 26 66 29 3b 0a 20  FEATURES, &f);. 
20680 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26     if( res==0 &&
20690 20 28 66 20 26 20 46 32 46 53 5f 46 45 41 54 55   (f & F2FS_FEATU
206a0 52 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29  RE_ATOMIC_WRITE)
206b0 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 64   ){.      pFd->d
206c0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
206d0 74 69 63 73 20 3d 20 53 51 4c 49 54 45 5f 49 4f  tics = SQLITE_IO
206e0 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
206f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
20700 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53  * __linux__ && S
20710 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
20720 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  CH_ATOMIC_WRITE 
20730 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  */..    /* Set t
20740 68 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  he POWERSAFE_OVE
20750 52 57 52 49 54 45 20 66 6c 61 67 20 69 66 20 72  RWRITE flag if r
20760 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20  equested. */.   
20770 20 69 66 28 20 70 46 64 2d 3e 63 74 72 6c 46 6c   if( pFd->ctrlFl
20780 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50  ags & UNIXFILE_P
20790 53 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 46 64  SOW ){.      pFd
207a0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
207b0 72 69 73 74 69 63 73 20 7c 3d 20 53 51 4c 49 54  ristics |= SQLIT
207c0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
207d0 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 20  E_OVERWRITE;.   
207e0 20 7d 0a 0a 20 20 20 20 70 46 64 2d 3e 73 65 63   }..    pFd->sec
207f0 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  torSize = SQLITE
20800 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
20810 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  SIZE;.  }.}.#els
20820 65 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  e.#include <sys/
20830 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63  dcmd_blk.h>.#inc
20840 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66  lude <sys/statvf
20850 73 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  s.h>.static void
20860 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63   setDeviceCharac
20870 74 65 72 69 73 74 69 63 73 28 75 6e 69 78 46 69  teristics(unixFi
20880 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66  le *pFile){.  if
20890 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  ( pFile->sectorS
208a0 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ize == 0 ){.    
208b0 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20 66  struct statvfs f
208c0 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20  sInfo;.       . 
208d0 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c     /* Set defaul
208e0 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f  ts for non-suppo
208f0 72 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d 73  rted filesystems
20900 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   */.    pFile->s
20910 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49  ectorSize = SQLI
20920 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
20930 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c  R_SIZE;.    pFil
20940 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
20950 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
20960 20 20 69 66 28 20 66 73 74 61 74 76 66 73 28 70    if( fstatvfs(p
20970 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f  File->h, &fsInfo
20980 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20  ) == -1 ) {.    
20990 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
209a0 0a 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70  .    if( !strcmp
209b0 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
209c0 70 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20  pe, "tmp") ) {. 
209d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
209e0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
209f0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
20a00 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
20a10 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
20a20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
20a30 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20  AP_ATOMIC4K |   
20a40 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66      /* All ram f
20a50 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73  ilesystem writes
20a60 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
20a70 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
20a80 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
20a90 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
20aa0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
20ab0 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ae0 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
20af0 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
20b00 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
20b10 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
20b20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
20b30 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
20b40 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
20b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b70 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
20b80 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
20b90 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
20ba0 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
20bb0 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74  .f_basetype, "et
20bc0 66 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  fs") ){.      pF
20bd0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20be0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
20bf0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
20c00 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20c10 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f  tics =.        /
20c20 2a 20 65 74 66 73 20 63 6c 75 73 74 65 72 20 73  * etfs cluster s
20c30 69 7a 65 20 77 72 69 74 65 73 20 61 72 65 20 61  ize writes are a
20c40 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
20c50 20 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53   (pFile->sectorS
20c60 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49  ize / 512 * SQLI
20c70 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
20c80 31 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51  12) |.        SQ
20c90 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
20ca0 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
20cb0 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
20cc0 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20cd0 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cf0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
20d00 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
20d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
20d20 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
20d30 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
20d40 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
20d50 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
20d60 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
20d90 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
20da0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
20db0 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
20dc0 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
20dd0 79 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a  ype, "qnx6") ){.
20de0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
20df0 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
20e00 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
20e10 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
20e20 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
20e30 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
20e40 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20  CAP_ATOMIC |    
20e50 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65       /* All file
20e60 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72  system writes ar
20e70 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
20e80 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
20e90 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
20ea0 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
20eb0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
20ec0 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
20f00 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
20f10 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
20f20 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
20f30 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
20f40 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
20f50 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
20f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f80 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
20f90 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
20fa0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
20fb0 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
20fc0 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34  _basetype, "qnx4
20fd0 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
20fe0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
20ff0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
21000 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
21010 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21020 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
21030 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61  full bitset of a
21040 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20  tomics from max 
21050 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20  sector size and 
21060 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20  smaller */.     
21070 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74     ((pFile->sect
21080 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
21090 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
210a0 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32  IC512) << 1) - 2
210b0 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   |.        SQLIT
210c0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
210d0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
210e0 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
210f0 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
21100 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21120 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
21130 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
21140 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
21150 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28  else if( strstr(
21160 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
21170 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20  e, "dos") ){.   
21180 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
21190 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
211a0 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
211b0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
211c0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
211d0 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73      /* full bits
211e0 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72  et of atomics fr
211f0 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69  om max sector si
21200 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a  ze and smaller *
21210 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c  /.        ((pFil
21220 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
21230 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
21240 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c  AP_ATOMIC512) <<
21250 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20   1) - 2 |.      
21260 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
21270 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
21280 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
21290 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
212a0 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212d0 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
212e0 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
212f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21300 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
21310 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
21320 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
21330 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
21340 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b   |      /* block
21350 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
21360 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
21370 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
21380 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
21390 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
213a0 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213d0 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
213e0 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
213f0 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20        0;.    }. 
21400 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61   }.  /* Last cha
21410 6e 63 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  nce verification
21420 2e 20 20 49 66 20 74 68 65 20 73 65 63 74 6f 72  .  If the sector
21430 20 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75   size isn't a mu
21440 6c 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20  ltiple of 512.  
21450 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74  ** then it isn't
21460 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20   valid.*/.  if( 
21470 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
21480 65 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a  e % 512 != 0 ){.
21490 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
214a0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
214b0 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
214c0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51  >sectorSize = SQ
214d0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
214e0 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a  TOR_SIZE;.  }.}.
214f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
21500 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
21510 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
21520 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
21530 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
21540 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
21550 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
21560 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
21570 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
21580 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
21590 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
215a0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
215b0 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
215c0 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
215d0 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
215e0 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
215f0 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
21600 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
21610 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
21620 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
21630 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
21640 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
21650 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
21660 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
21670 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
21680 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
21690 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
216a0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
216b0 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
216c0 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  *pFd = (unixFile
216d0 2a 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69 63  *)id;.  setDevic
216e0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
216f0 28 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pFd);.  return 
21700 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  pFd->sectorSize;
21710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21720 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
21730 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20  acteristics for 
21740 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
21750 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20  This VFS is set 
21760 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  up to return SQL
21770 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
21780 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79  AFE_OVERWRITE by
21790 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77   default..** How
217a0 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63  ever, that choic
217b0 65 20 69 73 20 63 6f 6e 74 72 6f 76 65 72 73 69  e is controversi
217c0 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63  al since technic
217d0 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79  ally the underly
217e0 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74  ing.** file syst
217f0 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61  em does not alwa
21800 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72  ys provide power
21810 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e  safe overwrites.
21820 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77    (In other.** w
21830 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f  ords, after a po
21840 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20  wer-loss event, 
21850 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c  parts of the fil
21860 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65  e that were neve
21870 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67  r.** written mig
21880 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
21890 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76  altered.)  Howev
218a0 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68  er, non-PSOW beh
218b0 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a  avior is very,.*
218c0 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e  * very rare.  An
218d0 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57  d asserting PSOW
218e0 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72   makes a large r
218f0 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  eduction in the 
21900 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71  amount.** of req
21910 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f  uired I/O for jo
21920 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20  urnaling, since 
21930 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67  a lot of padding
21940 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a   is eliminated..
21950 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65  **  Hence, while
21960 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
21970 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65  RITE is on by de
21980 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20  fault, there is 
21990 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a  a file-control.*
219a0 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  * available to t
219b0 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55  urn it off and U
219c0 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  RI query paramet
219d0 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  er available to 
219e0 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a  turn it off..*/.
219f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
21a00 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
21a10 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
21a20 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
21a30 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
21a40 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 74 44 65  ile*)id;.  setDe
21a50 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
21a60 69 63 73 28 70 46 64 29 3b 0a 20 20 72 65 74 75  ics(pFd);.  retu
21a70 72 6e 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68  rn pFd->deviceCh
21a80 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 7d  aracteristics;.}
21a90 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
21aa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
21ab0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
21ac0 41 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a  AP_SIZE>0../*.**
21ad0 20 52 65 74 75 72 6e 20 74 68 65 20 73 79 73 74   Return the syst
21ae0 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  em page size..**
21af0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
21b00 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  n should not be 
21b10 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20  called directly 
21b20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69 6e  by other code in
21b30 20 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20   this file. .** 
21b40 49 6e 73 74 65 61 64 2c 20 69 74 20 73 68 6f 75  Instead, it shou
21b50 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 76 69 61  ld be called via
21b60 20 6d 61 63 72 6f 20 6f 73 47 65 74 70 61 67 65   macro osGetpage
21b70 73 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  size()..*/.stati
21b80 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67  c int unixGetpag
21b90 65 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66  esize(void){.#if
21ba0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65   OS_VXWORKS.  re
21bb0 74 75 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69 66  turn 1024;.#elif
21bc0 20 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f   defined(_BSD_SO
21bd0 55 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67  URCE).  return g
21be0 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65  etpagesize();.#e
21bf0 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e  lse.  return (in
21c00 74 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41  t)sysconf(_SC_PA
21c10 47 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a  GESIZE);.#endif.
21c20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  }..#endif /* !de
21c30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
21c40 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
21c50 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
21c60 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
21c70 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a  ITE_OMIT_WAL../*
21c80 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
21c90 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20  to represent an 
21ca0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75  shared memory bu
21cb0 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  ffer.  .**.** Wh
21cc0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
21cd0 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
21ce0 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69  e the same wal-i
21cf0 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61  ndex, each threa
21d00 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e  d.** has its own
21d10 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c   unixShm object,
21d20 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f   but they all po
21d30 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
21d40 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74  instance.** of t
21d50 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
21d60 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
21d70 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61  r words, each wa
21d80 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  l-index is opene
21d90 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  d.** only once p
21da0 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
21db0 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f  * Each unixShmNo
21dc0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  de object is con
21dd0 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67  nected to a sing
21de0 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  le unixInodeInfo
21df0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63   object..** We c
21e00 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68  ould coalesce th
21e10 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75  is object into u
21e20 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75  nixInodeInfo, bu
21e30 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61  t that would mea
21e40 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20  n.** every open 
21e50 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  file that does n
21e60 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65  ot use shared me
21e70 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77  mory (in other w
21e80 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70  ords, most.** op
21e90 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20  en files) would 
21ea0 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72  have to carry ar
21eb0 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20  ound this extra 
21ec0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f  information.  So
21ed0 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  .** the unixInod
21ee0 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e  eInfo object con
21ef0 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
21f00 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  to this unixShmN
21f10 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e  ode object.** an
21f20 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  d the unixShmNod
21f30 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
21f40 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65  ted only when ne
21f50 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78  eded..**.** unix
21f60 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
21f70 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
21f80 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
21f90 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
21fa0 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
21fb0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
21fc0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
21fd0 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
21fe0 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20   nRef.**.** The 
21ff0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
22000 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
22010 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
22020 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a  is created:.** .
22030 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20  **      fid.**  
22040 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a      zFilename.**
22050 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53  .** Either unixS
22060 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
22070 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69  t be held or uni
22080 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
22090 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65   and.** unixMute
220a0 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20  xHeld() is true 
220b0 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20  when reading or 
220c0 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65  writing any othe
220d0 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68  r field.** in th
220e0 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
220f0 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e  .struct unixShmN
22100 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ode {.  unixInod
22110 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
22120 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49     /* unixInodeI
22130 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68  nfo that owns th
22140 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20  is SHM node */. 
22150 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
22160 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
22170 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
22180 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
22190 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
221a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
221b0 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65  me of the mmappe
221c0 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
221d0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
221e0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
221f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
22200 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
22210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22220 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
22230 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
22240 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e  */.  u16 nRegion
22250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22260 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
22270 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75   apRegion */.  u
22280 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20  8 isReadonly;   
22290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
222a0 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e if read-only *
222b0 2f 0a 20 20 75 38 20 69 73 55 6e 6c 6f 63 6b 65  /.  u8 isUnlocke
222c0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
222d0 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 44 4d 53  * True if no DMS
222e0 20 6c 6f 63 6b 20 68 65 6c 64 20 2a 2f 0a 20 20   lock held */.  
222f0 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b  char **apRegion;
22300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22310 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68  ray of mapped sh
22320 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
22330 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
22340 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
22350 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22360 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
22370 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
22380 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  s */.  unixShm *
22390 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
223a0 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d    /* All unixShm
223b0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
223c0 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66  g to this */.#if
223d0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
223e0 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
223f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22400 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
22410 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
22420 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b  .  u8 sharedMask
22430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22440 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
22450 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
22460 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
22470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
22480 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69  xt available uni
22490 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  xShm.id value */
224a0 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
224b0 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
224c0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
224d0 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
224e0 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
224f0 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
22500 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
22510 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
22520 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
22530 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
22540 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
22550 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
22560 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
22570 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
22580 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69  *    unixShm.pFi
22590 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  le.**    unixShm
225a0 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
225b0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
225c0 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
225d0 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d  unixShm.pFile->m
225e0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
225f0 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
22600 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
22610 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
22620 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a  truct unixShm {.
22630 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
22640 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  ShmNode;     /* 
22650 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75  The underlying u
22660 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
22670 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  t */.  unixShm *
22680 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
22690 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68    /* Next unixSh
226a0 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
226b0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
226c0 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
226d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
226e0 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
226f0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d  he unixShmNode m
22700 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b  utex */.  u8 id;
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22720 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
22730 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
22740 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d  thin its unixShm
22750 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68  Node */.  u16 sh
22760 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
22770 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
22780 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
22790 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
227a0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
227b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
227c0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
227d0 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  d */.};../*.** C
227e0 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
227f0 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
22800 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41  fine UNIX_SHM_BA
22810 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
22820 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
22830 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
22840 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
22850 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  fine UNIX_SHM_DM
22860 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42  S    (UNIX_SHM_B
22870 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
22880 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
22890 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
228a0 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61  ** Apply posix a
228b0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
228c0 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d  r all bytes from
228d0 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66   ofst through of
228e0 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  st+n-1..**.** Lo
228f0 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65  cks block if the
22900 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79   mask is exactly
22910 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20   UNIX_SHM_C and 
22920 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67  are non-blocking
22930 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
22940 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22950 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  xShmSystemLock(.
22960 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
22970 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  e,       /* Open
22980 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
22990 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20  he WAL file */. 
229a0 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
229b0 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c          /* F_UNL
229c0 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20  CK, F_RDLCK, or 
229d0 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  F_WRLCK */.  int
229e0 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
229f0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
22a00 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e of the locking
22a10 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20   range */.  int 
22a20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
22a30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22a40 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
22a50 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  .){.  unixShmNod
22a60 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
22a70 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
22a80 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
22a90 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
22aa0 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  /.  struct flock
22ab0 20 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68   f;        /* Th
22ac0 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
22ad0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
22ae0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
22af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f   SQLITE_OK;    /
22b00 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
22b10 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20  rm fcntl() */.. 
22b20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
22b30 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
22b40 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
22b50 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
22b60 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d   */.  pShmNode =
22b70 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
22b80 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65  pShmNode;.  asse
22b90 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
22ba0 65 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ef==0 || sqlite3
22bb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d  _mutex_held(pShm
22bc0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  Node->mutex) );.
22bd0 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63  .  /* Shared loc
22be0 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f  ks never span mo
22bf0 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65  re than one byte
22c00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   */.  assert( n=
22c10 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d  =1 || lockType!=
22c20 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a  F_RDLCK );..  /*
22c30 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69   Locks are withi
22c40 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73  n range */.  ass
22c50 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d  ert( n>=1 && n<=
22c60 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
22c70 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
22c80 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
22c90 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
22ca0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
22cb0 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 66 2e 6c  eters */.    f.l
22cc0 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65  _type = lockType
22cd0 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65  ;.    f.l_whence
22ce0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
22cf0 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73   f.l_start = ofs
22d00 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d  t;.    f.l_len =
22d10 20 6e 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 53   n;.    rc = osS
22d20 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79 4c  etPosixAdvisoryL
22d30 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ock(pShmNode->h,
22d40 20 26 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20 20   &f, pFile);.   
22d50 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29   rc = (rc!=(-1))
22d60 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
22d70 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
22d80 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
22d90 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
22da0 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
22db0 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
22dc0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
22dd0 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f   { u16 mask;.  O
22de0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
22df0 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  K "));.  mask = 
22e00 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66  ofst>31 ? 0xffff
22e10 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   : (1<<(ofst+n))
22e20 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
22e30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22e40 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
22e50 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
22e60 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
22e70 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
22e80 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
22e90 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
22ea0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
22eb0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
22ec0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
22ed0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
22ee0 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
22ef0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
22f00 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
22f10 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
22f20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
22f30 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
22f40 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
22f50 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
22f60 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
22f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
22f80 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
22f90 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
22fa0 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
22fb0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
22fc0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
22fd0 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
22fe0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
22ff0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
23000 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
23010 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
23020 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
23030 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
23040 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
23050 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
23060 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
23070 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
23080 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
23090 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
230a0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
230b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
230c0 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
230d0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
230e0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
230f0 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
23100 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
23110 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
23120 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
23130 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
23140 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
23150 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
23160 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
23170 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
23180 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  c;        .}../*
23190 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
231a0 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
231b0 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e   32KB shm region
231c0 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
231d0 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20   mapped at.** a 
231e0 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  time, assuming t
231f0 68 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67  hat each mapping
23200 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65   must be an inte
23210 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
23220 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73  the.** current s
23230 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e  ystem page-size.
23240 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  .**.** Usually, 
23250 74 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65  this is 1. The e
23260 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74  xception seems t
23270 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61  o be systems tha
23280 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64  t are configured
23290 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20  .** to use 64KB 
232a0 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20  pages - in this 
232b0 63 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e  case each mappin
232c0 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20  g must cover at 
232d0 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d  least two.** shm
232e0 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61   regions..*/.sta
232f0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52  tic int unixShmR
23300 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64  egionPerMap(void
23310 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d  ){.  int shmsz =
23320 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20   32*1024;       
23330 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69       /* SHM regi
23340 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  on size */.  int
23350 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67   pgsz = osGetpag
23360 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79  esize();   /* Sy
23370 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a  stem page size *
23380 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67  /.  assert( ((pg
23390 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29  sz-1)&pgsz)==0 )
233a0 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  ;   /* Page size
233b0 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
233c0 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70   of 2 */.  if( p
233d0 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75  gsz<shmsz ) retu
233e0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn 1;.  return p
233f0 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a  gsz/shmsz;.}../*
23400 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
23410 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
23420 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
23430 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
23440 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
23450 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
23460 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
23470 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
23480 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
23490 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
234a0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
234b0 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
234c0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
234d0 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
234e0 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
234f0 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
23500 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
23510 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
23520 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
23530 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28  if( p && ALWAYS(
23540 70 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20  p->nRef==0) ){. 
23550 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61     int nShmPerMa
23560 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f  p = unixShmRegio
23570 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69  nPerMap();.    i
23580 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74  nt i;.    assert
23590 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64  ( p->pInode==pFd
235a0 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ->pInode );.    
235b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
235c0 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
235d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
235e0 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d  nRegion; i+=nShm
235f0 50 65 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69  PerMap){.      i
23600 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
23610 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
23620 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70  ->apRegion[i], p
23630 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->szRegion);.   
23640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23650 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
23660 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a  ->apRegion[i]);.
23670 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23680 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
23690 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->apRegion);.   
236a0 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
236b0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
236c0 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f  se(pFd, p->h, __
236d0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70  LINE__);.      p
236e0 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ->h = -1;.    }.
236f0 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70      p->pInode->p
23700 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ShmNode = 0;.   
23710 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
23720 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
23730 68 65 20 44 4d 53 20 6c 6f 63 6b 20 68 61 73 20  he DMS lock has 
23740 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 74 61 6b  not yet been tak
23750 65 6e 20 6f 6e 20 73 68 6d 20 66 69 6c 65 20 70  en on shm file p
23760 53 68 6d 4e 6f 64 65 2e 20 41 74 74 65 6d 70 74  ShmNode. Attempt
23770 20 74 6f 0a 2a 2a 20 74 61 6b 65 20 69 74 20 6e   to.** take it n
23780 6f 77 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ow. Return SQLIT
23790 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
237a0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
237b0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f   error.** code o
237c0 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
237d0 49 66 20 74 68 65 20 44 4d 53 20 63 61 6e 6e 6f  If the DMS canno
237e0 74 20 62 65 20 6c 6f 63 6b 65 64 20 62 65 63 61  t be locked beca
237f0 75 73 65 20 74 68 69 73 20 69 73 20 61 20 72 65  use this is a re
23800 61 64 6f 6e 6c 79 5f 73 68 6d 3d 31 20 0a 2a 2a  adonly_shm=1 .**
23810 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20   connection and 
23820 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
23830 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
23840 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a   lock, return.**
23850 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
23860 5f 43 41 4e 54 49 4e 49 54 20 61 6e 64 20 73 65  _CANTINIT and se
23870 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e  t pShmNode->isUn
23880 6c 6f 63 6b 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61  locked=1..*/.sta
23890 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
238a0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
238b0 78 46 69 6c 65 20 2a 70 44 62 46 64 2c 20 75 6e  xFile *pDbFd, un
238c0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
238d0 6f 64 65 29 7b 0a 20 20 73 74 72 75 63 74 20 66  ode){.  struct f
238e0 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
238f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23900 0a 0a 20 20 2f 2a 20 55 73 65 20 46 5f 47 45 54  ..  /* Use F_GET
23910 4c 4b 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  LK to determine 
23920 74 68 65 20 6c 6f 63 6b 73 20 6f 74 68 65 72 20  the locks other 
23930 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 68 6f  processes are ho
23940 6c 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 74 68  lding.  ** on th
23950 65 20 44 4d 53 20 62 79 74 65 2e 20 49 66 20 69  e DMS byte. If i
23960 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
23970 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
23980 20 69 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a   is holding.  **
23990 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
239a0 74 68 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73  then this proces
239b0 73 20 6d 61 79 20 61 6c 73 6f 20 74 61 6b 65 20  s may also take 
239c0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
239d0 2a 2a 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ** and proceed w
239e0 69 74 68 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ith opening the 
239f0 2a 2d 73 68 6d 20 66 69 6c 65 2e 20 0a 20 20 2a  *-shm file. .  *
23a00 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f  *.  ** Or, if no
23a10 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
23a20 73 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c 6f  s holding any lo
23a30 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 70 72  ck, then this pr
23a40 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 74 68  ocess.  ** is th
23a50 65 20 66 69 72 73 74 20 74 6f 20 6f 70 65 6e 20  e first to open 
23a60 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  it. In this case
23a70 20 74 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49   take an EXCLUSI
23a80 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
23a90 20 2a 2a 20 44 4d 53 20 62 79 74 65 20 61 6e 64   ** DMS byte and
23aa0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 2a 2d   truncate the *-
23ab0 73 68 6d 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  shm file to zero
23ac0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
23ad0 54 68 65 6e 0a 20 20 2a 2a 20 64 6f 77 6e 67 72  Then.  ** downgr
23ae0 61 64 65 20 74 6f 20 61 20 53 48 41 52 45 44 20  ade to a SHARED 
23af0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d 53 20  lock on the DMS 
23b00 62 79 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  byte..  **.  ** 
23b10 49 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  If another proce
23b20 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  ss is holding an
23b30 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
23b40 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74 65 2c  on the DMS byte,
23b50 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
23b60 49 54 45 5f 42 55 53 59 20 74 6f 20 74 68 65 20  ITE_BUSY to the 
23b70 63 61 6c 6c 65 72 20 28 69 74 20 77 69 6c 6c 20  caller (it will 
23b80 74 72 79 20 61 67 61 69 6e 29 2e 20 41 6e 20 65  try again). An e
23b90 61 72 6c 69 65 72 0a 20 20 2a 2a 20 76 65 72 73  arlier.  ** vers
23ba0 69 6f 6e 20 6f 66 20 74 68 69 73 20 63 6f 64 65  ion of this code
23bb0 20 61 74 74 65 6d 70 74 65 64 20 74 68 65 20 53   attempted the S
23bc0 48 41 52 45 44 20 6c 6f 63 6b 20 61 74 20 74 68  HARED lock at th
23bd0 69 73 20 70 6f 69 6e 74 2e 20 42 75 74 0a 20 20  is point. But.  
23be0 2a 2a 20 74 68 69 73 20 69 6e 74 72 6f 64 75 63  ** this introduc
23bf0 65 64 20 61 20 73 75 62 74 6c 65 20 72 61 63 65  ed a subtle race
23c00 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 69 66 20 74   condition: if t
23c10 68 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 69  he process holdi
23c20 6e 67 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  ng.  ** EXCLUSIV
23c30 45 20 66 61 69 6c 65 64 20 6a 75 73 74 20 62 65  E failed just be
23c40 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 20  fore truncating 
23c50 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2c 20  the *-shm file, 
23c60 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70  then this.  ** p
23c70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
23c80 6e 20 61 6e 64 20 75 73 65 20 74 68 65 20 2a 2d  n and use the *-
23c90 73 68 6d 20 66 69 6c 65 20 77 69 74 68 6f 75 74  shm file without
23ca0 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
23cb0 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
23cc0 2a 2d 73 68 6d 20 66 69 6c 65 20 68 61 73 20 62  *-shm file has b
23cd0 65 65 6e 20 63 6f 72 72 75 70 74 65 64 20 62 79  een corrupted by
23ce0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
23cf0 20 6f 72 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20   or.  ** system 
23d00 63 72 61 73 68 2c 20 74 68 65 20 64 61 74 61 62  crash, the datab
23d10 61 73 65 20 69 74 73 65 6c 66 20 6d 61 79 20 61  ase itself may a
23d20 6c 73 6f 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  lso become corru
23d30 70 74 2e 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  pt.  */.  lock.l
23d40 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
23d50 45 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ET;.  lock.l_sta
23d60 72 74 20 3d 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  rt = UNIX_SHM_DM
23d70 53 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  S;.  lock.l_len 
23d80 3d 20 31 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 74 79  = 1;.  lock.l_ty
23d90 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
23da0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d  if( osFcntl(pShm
23db0 4e 6f 64 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  Node->h, F_GETLK
23dc0 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 20 7b 0a  , &lock)!=0 ) {.
23dd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23de0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65  IOERR_LOCK;.  }e
23df0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74  lse if( lock.l_t
23e00 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
23e10 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
23e20 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a  ->isReadonly ){.
23e30 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
23e40 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a  isUnlocked = 1;.
23e50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23e60 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49  E_READONLY_CANTI
23e70 4e 49 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  NIT;.    }else{.
23e80 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
23e90 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
23ea0 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49  Fd, F_WRLCK, UNI
23eb0 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
23ec0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23ed0 49 54 45 5f 4f 4b 20 26 26 20 72 6f 62 75 73 74  ITE_OK && robust
23ee0 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
23ef0 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20  ode->h, 0) ){.  
23f00 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
23f10 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
23f20 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 22 66 74  OERR_SHMOPEN,"ft
23f30 72 75 6e 63 61 74 65 22 2c 70 53 68 6d 4e 6f 64  runcate",pShmNod
23f40 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
23f50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23f60 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
23f70 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
23f80 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
23f90 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 69 66  _BUSY;.  }..  if
23fa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23fb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  ){.    assert( l
23fc0 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e  ock.l_type==F_UN
23fd0 4c 43 4b 20 7c 7c 20 6c 6f 63 6b 2e 6c 5f 74 79  LCK || lock.l_ty
23fe0 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 20  pe==F_RDLCK );. 
23ff0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
24000 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
24010 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_RDLCK, UNIX_S
24020 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a  HM_DMS, 1);.  }.
24030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24040 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
24050 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
24060 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
24070 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
24080 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
24090 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
240a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
240b0 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
240c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
240d0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
240e0 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
240f0 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
24100 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
24110 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
24120 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
24130 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
24140 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
24150 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
24160 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
24170 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
24180 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
24190 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
241a0 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
241b0 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
241c0 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
241d0 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
241e0 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
241f0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
24200 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
24210 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
24220 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
24230 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
24240 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
24250 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
24260 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
24270 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
24280 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
24290 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
242a0 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
242b0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
242c0 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
242d0 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
242e0 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
242f0 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
24300 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
24310 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
24320 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
24330 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
24340 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
24350 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
24360 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
24370 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
24380 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
24390 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
243a0 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
243b0 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
243c0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
243d0 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
243e0 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
243f0 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
24400 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
24410 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
24420 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
24430 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
24440 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
24450 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
24460 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
24470 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
24480 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
24490 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
244a0 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
244b0 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
244c0 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
244d0 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
244e0 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
244f0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
24500 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
24510 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
24520 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
24530 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
24540 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
24550 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
24560 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
24570 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
24580 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
24590 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
245a0 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
245b0 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
245c0 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
245d0 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
245e0 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
245f0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
24600 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
24610 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
24620 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
24630 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
24640 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
24650 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
24660 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
24670 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
24680 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
24690 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
246a0 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
246b0 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
246c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
246d0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
246e0 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
246f0 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
24700 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
24710 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
24720 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
24730 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
24740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
24750 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
24760 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
24770 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
24780 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
24790 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
247a0 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
247b0 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
247c0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
247d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
247e0 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
247f0 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
24800 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
24810 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
24820 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
24830 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
24840 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
24850 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
24860 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
24870 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
24880 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
24890 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
248a0 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
248b0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
248c0 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
248d0 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
248e0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ile */.  int rc 
248f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
24900 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
24910 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
24920 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
24930 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
24940 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
24950 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 3b  */.  char *zShm;
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24970 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
24980 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f   used for SHM */
24990 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e  .  int nShmFilen
249a0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
249b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
249c0 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69  e SHM filename i
249d0 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
249e0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
249f0 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
24a00 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  Shm object. */. 
24a10 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
24a20 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
24a30 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
24a40 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
24a50 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65  NOMEM_BKPT;.  me
24a60 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
24a70 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74  f(*p));.  assert
24a80 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
24a90 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
24aa0 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78  to see if a unix
24ab0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61  ShmNode object a
24ac0 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52  lready exists. R
24ad0 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
24ae0 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65  .  ** one if pre
24af0 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e  sent. Create a n
24b00 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
24b10 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  ary..  */.  unix
24b20 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
24b30 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e  pInode = pDbFd->
24b40 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f  pInode;.  pShmNo
24b50 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68  de = pInode->pSh
24b60 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68  mNode;.  if( pSh
24b70 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
24b80 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
24b90 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
24ba0 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e     /* fstat() in
24bb0 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  fo for database 
24bc0 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  file */.#ifndef 
24bd0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
24be0 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20 63  TORY.    const c
24bf0 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d  har *zBasePath =
24c00 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23   pDbFd->zPath;.#
24c10 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 61  endif..    /* Ca
24c20 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69  ll fstat() to fi
24c30 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72  gure out the per
24c40 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
24c50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24c60 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a  f.    ** a new *
24c70 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65  -shm file is cre
24c80 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74  ated, an attempt
24c90 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
24ca0 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a   create it.    *
24cb0 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
24cc0 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20  permissions..   
24cd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73   */.    if( osFs
24ce0 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73  tat(pDbFd->h, &s
24cf0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72  Stat) ){.      r
24d00 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
24d10 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f  _FSTAT;.      go
24d20 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
24d30 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
24d40 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
24d50 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65  ORY.    nShmFile
24d60 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51  name = sizeof(SQ
24d70 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
24d80 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a  RY) + 31;.#else.
24d90 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
24da0 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c   = 6 + (int)strl
24db0 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23  en(zBasePath);.#
24dc0 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f  endif.    pShmNo
24dd0 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
24de0 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
24df0 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46  ShmNode) + nShmF
24e00 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69  ilename );.    i
24e10 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
24e20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
24e30 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
24e40 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
24e50 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
24e60 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f     memset(pShmNo
24e70 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
24e80 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c  ShmNode)+nShmFil
24e90 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d  ename);.    zShm
24ea0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
24eb0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
24ec0 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
24ed0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
24ee0 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
24ef0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
24f00 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
24f10 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
24f20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
24f30 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f  SHM_DIRECTORY "/
24f40 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78  sqlite-shm-%x-%x
24f50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
24f60 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74          (u32)sSt
24f70 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29  at.st_ino, (u32)
24f80 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23  sStat.st_dev);.#
24f90 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
24fa0 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
24fb0 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 22 25  lename, zShm, "%
24fc0 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74  s-shm", zBasePat
24fd0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
24fe0 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
24ff0 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 29 3b 0a  ->zPath, zShm);.
25000 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
25010 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20  ode->h = -1;.   
25020 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
25030 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
25040 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
25050 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46  e->pInode = pDbF
25060 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69  d->pInode;.    i
25070 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
25080 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
25090 78 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e  x ){.      pShmN
250a0 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
250b0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
250c0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
250d0 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ST);.      if( p
250e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
250f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
25100 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
25110 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
25120 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
25130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25140 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
25150 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
25160 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  {.      if( 0==s
25170 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
25180 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  an(pDbFd->zPath,
25190 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c   "readonly_shm",
251a0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
251b0 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
251c0 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f  ust_open(zShm, O
251d0 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 28  _RDWR|O_CREAT, (
251e0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37  sStat.st_mode&07
251f0 37 37 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  77));.      }.  
25200 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
25210 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ->h<0 ){.       
25220 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72   pShmNode->h = r
25230 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c  obust_open(zShm,
25240 20 4f 5f 52 44 4f 4e 4c 59 2c 20 28 73 53 74 61   O_RDONLY, (sSta
25250 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29  t.st_mode&0777))
25260 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
25270 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20  hmNode->h<0 ){. 
25280 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
25290 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
252a0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
252b0 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 29 3b 0a   "open", zShm);.
252c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
252d0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
252e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
252f0 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
25300 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
25310 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
25320 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75  is process is ru
25330 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d  nning as root, m
25340 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
25350 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20  e SHM file.     
25360 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20   ** is owned by 
25370 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74 68  the same user th
25380 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67  at owns the orig
25390 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20  inal database.  
253a0 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
253b0 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
253c0 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20   owner will not 
253d0 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  be able to conne
253e0 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ct..      */.   
253f0 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28     robustFchown(
25400 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
25410 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74  at.st_uid, sStat
25420 2e 73 74 5f 67 69 64 29 3b 0a 0a 20 20 20 20 20  .st_gid);..     
25430 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53 68   rc = unixLockSh
25440 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
25450 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20  , pShmNode);.   
25460 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25470 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
25480 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
25490 49 4e 49 54 20 29 20 67 6f 74 6f 20 73 68 6d 5f  INIT ) goto shm_
254a0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
254b0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
254c0 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
254d0 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
254e0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
254f0 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
25500 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
25510 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
25520 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
25530 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
25540 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
25550 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
25560 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75  d->pShm = p;.  u
25570 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
25580 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
25590 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
255a0 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
255b0 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
255c0 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
255d0 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
255e0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
255f0 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
25600 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
25610 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
25620 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74   unixShm) object
25630 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
25640 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
25650 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
25660 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
25670 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
25680 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
25690 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
256a0 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
256b0 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
256c0 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
256d0 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
256e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
256f0 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
25700 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
25710 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
25720 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
25730 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
25740 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
25750 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
25760 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
25770 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
25780 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
25790 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  rn rc;..  /* Jum
257a0 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
257b0 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
257c0 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
257d0 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
257e0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
257f0 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
25800 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
25810 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
25820 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
25830 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
25840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
25850 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
25860 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
25870 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
25880 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
25890 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
258a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
258b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
258c0 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
258d0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
258e0 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
258f0 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
25900 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
25910 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
25920 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
25930 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
25940 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
25950 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
25960 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
25970 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
25980 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
25990 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62  erwise, if the b
259a0 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72  Extend parameter
259b0 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
259c0 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
259d0 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
259e0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
259f0 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
25a00 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
25a10 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
25a20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
25a30 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
25a40 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
25a50 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
25a60 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62  turned. If .** b
25a70 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65  Extend is non-ze
25a80 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
25a90 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
25aa0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
25ab0 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
25ac0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
25ad0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
25ae0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
25af0 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
25b00 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
25b10 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
25b20 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
25b30 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
25b40 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
25b50 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
25b60 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
25b70 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
25b80 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
25b90 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
25ba0 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
25bb0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
25bc0 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
25bd0 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
25be0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
25bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25c00 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71  unixShmMap(.  sq
25c10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
25c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25c30 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
25c40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25c50 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c70 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
25c80 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
25c90 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25cb0 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
25cc0 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e   */.  int bExten
25cd0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
25ce0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
25cf0 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
25d00 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
25d10 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
25d20 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
25d30 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
25d40 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  mory */.){.  uni
25d50 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
25d60 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
25d70 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e  unixShm *p;.  un
25d80 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
25d90 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
25da0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
25db0 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
25dc0 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
25dd0 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52  p();.  int nReqR
25de0 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  egion;..  /* If 
25df0 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
25e00 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
25e10 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
25e20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
25e30 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
25e40 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
25e50 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
25e60 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
25e70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25e80 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
25e90 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
25ea0 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
25eb0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
25ec0 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
25ed0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
25ee0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
25ef0 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c   pShmNode->isUnl
25f00 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 72 63 20  ocked ){.    rc 
25f10 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64  = unixLockShared
25f20 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53  Memory(pDbFd, pS
25f30 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  hmNode);.    if(
25f40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25f50 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
25f60 74 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  t;.    pShmNode-
25f70 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b  >isUnlocked = 0;
25f80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
25f90 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
25fa0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
25fb0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
25fc0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
25fd0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
25fe0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
25ff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
26000 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
26010 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
26020 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
26030 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
26040 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
26050 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
26060 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
26070 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
26080 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
26090 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
260a0 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
260b0 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
260c0 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
260d0 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
260e0 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
260f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
26100 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
26110 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
26120 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
26130 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
26140 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
26150 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
26160 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
26170 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
26180 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
26190 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
261a0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
261b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
261c0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
261d0 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
261e0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
261f0 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
26200 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
26210 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
26220 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
26230 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
26240 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
26250 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
26260 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
26270 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
26280 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
26290 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
262a0 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
262b0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
262c0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
262d0 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
262e0 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
262f0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
26300 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
26310 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
26320 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26330 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
26340 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
26350 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
26360 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
26370 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
26380 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
26390 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
263a0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
263b0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
263c0 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
263d0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
263e0 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
263f0 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
26400 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
26410 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
26420 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26430 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
26440 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
26450 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
26460 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
26470 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
26480 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
26490 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
264a0 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
264b0 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
264c0 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
264d0 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
264e0 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
264f0 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
26500 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
26510 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
26520 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
26530 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
26540 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
26550 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
26560 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
26570 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
26580 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
26590 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
265a0 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
265b0 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
265c0 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
265d0 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
265e0 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
265f0 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
26600 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
26610 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
26620 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
26630 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
26640 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
26650 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
26660 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
26670 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
26680 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
26690 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
266a0 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
266b0 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
266c0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
266d0 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
266e0 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
266f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
26700 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
26710 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
26720 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
26730 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
26740 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t x = 0;.       
26750 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
26760 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
26770 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20  ->h, iPg*pgsz + 
26780 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26  pgsz-1, "", 1, &
26790 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  x)!=1 ){.       
267a0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
267b0 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e  r *zFile = pShmN
267c0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ode->zFilename;.
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
267e0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
267f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
26800 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a  SIZE, "write", z
26810 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
26820 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
26830 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  e_out;.         
26840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
26850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26860 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
26870 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
26880 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
26890 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
268a0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
268b0 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
268c0 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
268d0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
268e0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
268f0 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67  pRegion, nReqReg
26900 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  ion*sizeof(char 
26910 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
26920 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
26930 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
26940 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
26950 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
26960 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
26970 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
26980 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20  gion = apNew;.  
26990 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
269a0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52  e->nRegion<nReqR
269b0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69  egion ){.      i
269c0 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69  nt nMap = szRegi
269d0 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  on*nShmPerMap;. 
269e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
269f0 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
26a00 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
26a10 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
26a20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28    pMem = osMmap(
26a30 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20  0, nMap,.       
26a40 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
26a50 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54  sReadonly ? PROT
26a60 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41  _READ : PROT_REA
26a70 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20  D|PROT_WRITE, . 
26a80 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53             MAP_S
26a90 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d  HARED, pShmNode-
26aa0 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36  >h, szRegion*(i6
26ab0 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  4)pShmNode->nReg
26ac0 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ion.        );. 
26ad0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
26ae0 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
26af0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
26b00 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
26b10 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
26b20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65  "mmap", pShmNode
26b30 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
26b40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
26b50 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
26b60 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
26b70 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
26b80 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
26b90 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
26ba0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
26bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
26bc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
26bd0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
26be0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
26bf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26c00 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
26c10 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
26c20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
26c30 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d  (i=0; i<nShmPerM
26c40 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ap; i++){.      
26c50 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
26c60 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
26c70 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63  Region+i] = &((c
26c80 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67  har*)pMem)[szReg
26c90 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  ion*i];.      }.
26ca0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
26cb0 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50  nRegion += nShmP
26cc0 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  erMap;.    }.  }
26cd0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
26ce0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
26cf0 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
26d00 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
26d10 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
26d20 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
26d30 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
26d40 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
26d50 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
26d60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
26d80 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
26d90 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
26da0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
26db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26dc0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
26dd0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
26de0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
26df0 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
26e00 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
26e10 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
26e20 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
26e30 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
26e40 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
26e50 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
26e60 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
26e70 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
26e80 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
26e90 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
26ea0 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
26eb0 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
26ec0 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
26ed0 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
26ee0 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
26ef0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
26f00 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
26f10 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
26f20 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
26f30 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
26f40 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
26f50 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
26f60 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
26f70 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
26f80 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fa0 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
26fb0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
26fc0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fe0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26ff0 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
27000 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
27010 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27030 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
27040 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
27050 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
27060 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
27070 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
27080 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
27090 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
270a0 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
270b0 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
270c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
270d0 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
270e0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
270f0 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27110 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
27120 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
27130 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
27140 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
27150 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
27160 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
27170 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
27180 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27190 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
271a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
271b0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
271c0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271e0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
271f0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
27200 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
27210 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
27220 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
27230 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
27240 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
27250 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
27260 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
27270 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
27280 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
27290 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
272a0 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
272b0 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
272c0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
272d0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
272e0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
272f0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
27300 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
27310 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
27320 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
27330 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
27340 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
27350 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
27360 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
27370 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
27380 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
27390 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
273a0 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
273b0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
273c0 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
273d0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
273e0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
273f0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
27400 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
27410 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
27420 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
27430 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
27440 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
27450 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
27460 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
27470 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
27480 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
27490 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
274a0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
274b0 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
274c0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
274d0 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
274e0 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
274f0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
27500 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
27510 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
27520 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
27530 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
27540 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
27550 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
27560 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
27570 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
27580 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
27590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
275a0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
275b0 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
275c0 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
275d0 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
275e0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
275f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
27600 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
27610 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
27620 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
27630 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
27640 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
27650 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
27660 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  Fd, F_UNLCK, ofs
27670 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
27680 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
27690 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
276a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
276b0 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
276c0 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
276d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
276e0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
276f0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
27700 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
27710 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
27720 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
27730 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
27740 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
27750 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
27760 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
27770 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
27780 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
27790 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
277a0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
277b0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
277c0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
277d0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
277e0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
277f0 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
27800 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
27810 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
27820 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
27830 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
27840 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
27850 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
27860 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
27870 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
27880 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
27890 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
278a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
278b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
278c0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
278d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
278e0 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
278f0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
27900 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
27910 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
27920 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
27930 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
27940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
27960 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
27970 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
27980 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
27990 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
279a0 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
279b0 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
279c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
279d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
279e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
279f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
27a00 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
27a10 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
27a20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27a30 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
27a40 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
27a50 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
27a60 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
27a70 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
27a80 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
27a90 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
27aa0 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
27ab0 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
27ac0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
27ad0 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
27ae0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
27af0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
27b00 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
27b10 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
27b20 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
27b30 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
27b40 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
27b50 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
27b60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27b70 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
27b80 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
27b90 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
27ba0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
27bb0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
27bc0 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
27bd0 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
27be0 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
27bf0 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
27c00 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
27c10 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
27c20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27c30 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
27c40 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
27c50 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
27c60 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
27c70 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
27c80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27c90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27ca0 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
27cb0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
27cc0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
27cd0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
27ce0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27cf0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
27d00 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
27d10 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
27d20 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
27d30 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
27d40 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
27d50 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
27d60 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20  d, osGetpid(0), 
27d70 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
27d80 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
27d90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27da0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
27db0 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
27dc0 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
27dd0 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
27de0 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
27df0 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
27e00 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
27e10 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
27e20 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
27e30 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
27e40 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
27e50 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
27e60 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
27e70 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
27e80 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
27e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
27ea0 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
27eb0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
27ec0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
27ed0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
27ee0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d  d);.  sqlite3Mem
27ef0 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20 20  oryBarrier();   
27f00 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65        /* compile
27f10 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  r-defined memory
27f20 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e   barrier */.  un
27f30 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
27f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27f50 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72   Also mutex, for
27f60 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20   redundancy */. 
27f70 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
27f80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
27f90 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
27fa0 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
27fb0 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
27fc0 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72  erlying .** stor
27fd0 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
27fe0 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  g is true..**.**
27ff0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
28000 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  shared memory as
28010 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
28020 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65  e connection the
28030 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
28040 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
28050 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
28060 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61   int unixShmUnma
28070 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
28080 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
28090 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
280a0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
280b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  file */.  int de
280c0 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
280d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
280e0 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ete shared-memor
280f0 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  y if true */.){.
28100 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20    unixShm *p;   
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28120 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
28130 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  ion to be closed
28140 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
28150 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
28160 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
28170 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
28180 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
28190 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20  unixShm **pp;   
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
281c0 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
281d0 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69  ections */.  uni
281e0 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  xFile *pDbFd;   
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28200 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
28210 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28220 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78  .  pDbFd = (unix
28230 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
28240 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
28250 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
28260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
28270 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
28280 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Node;..  assert(
28290 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
282a0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
282b0 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
282c0 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
282d0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
282e0 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  );..  /* Remove 
282f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
28300 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
28310 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
28320 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
28330 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
28340 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
28350 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
28360 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
28370 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
28380 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
28390 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
283a0 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
283b0 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
283c0 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
283d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
283e0 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
283f0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
28400 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
28410 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
28420 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
28430 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
28440 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
28450 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
28460 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
28470 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
28480 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
28490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
284a0 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
284b0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
284c0 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
284d0 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
284e0 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
284f0 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  g && pShmNode->h
28500 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  >=0 ){.      osU
28510 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e  nlink(pShmNode->
28520 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
28530 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72  }.    unixShmPur
28540 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20  ge(pDbFd);.  }. 
28550 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
28560 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
28570 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73  ITE_OK;.}...#els
28580 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  e.# define unixS
28590 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
285a0 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  fine unixShmLock
285b0 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
285c0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a  nixShmBarrier 0.
285d0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
285e0 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
285f0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
28600 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
28610 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
28620 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
28630 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   If it is curren
28640 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  tly memory mappe
28650 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46  d, unmap file pF
28660 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
28670 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28  d unixUnmapfile(
28680 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a  unixFile *pFd){.
28690 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
286a0 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23  FetchOut==0 );.#
286b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 41  ifdef SQLITE_SHA
286c0 52 45 44 5f 4d 41 50 50 49 4e 47 0a 20 20 69 66  RED_MAPPING.  if
286d0 28 20 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 20  ( pFd->pInode ) 
286e0 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20  return;.#endif. 
286f0 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
28700 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75  gion ){.    osMu
28710 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65  nmap(pFd->pMapRe
28720 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53  gion, pFd->mmapS
28730 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20  izeActual);.    
28740 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
28750 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
28760 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  apSize = 0;.    
28770 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
28780 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ual = 0;.  }.}..
28790 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
287a0 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   set the size of
287b0 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
287c0 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  ing maintained b
287d0 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72  y file .** descr
287e0 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65  iptor pFd to nNe
287f0 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69  w bytes. Any exi
28800 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
28810 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a   discarded..**.*
28820 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
28830 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
28840 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ets the followin
28850 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a  g variables:.**.
28860 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
28870 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20  e.pMapRegion.** 
28880 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d        unixFile.m
28890 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20  mapSize.**      
288a0 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69   unixFile.mmapSi
288b0 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49  zeActual.**.** I
288c0 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  f unsuccessful, 
288d0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
288e0 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73   is logged via s
288f0 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64  qlite3_log() and
28900 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76 61  .** the three va
28910 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72  riables above ar
28920 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69  e zeroed. In thi
28930 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73 68  s case SQLite sh
28940 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  ould.** continue
28950 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
28960 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
28970 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78 57  e xRead() and xW
28980 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  rite().** method
28990 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
289a0 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28  d unixRemapfile(
289b0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
289c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
289d0 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
289e0 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  iptor object */.
289f0 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20    i64 nNew      
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61    /* Required ma
28a20 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b  pping size */.){
28a30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28a40 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20  Err = "mmap";.  
28a50 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20  int h = pFd->h; 
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
28a80 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
28a90 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  db file */.  u8 
28aa0 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70  *pOrig = (u8 *)p
28ab0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20  Fd->pMapRegion; 
28ac0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
28ad0 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70  current file map
28ae0 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f  ping */.  i64 nO
28af0 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  rig = pFd->mmapS
28b00 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f  izeActual;     /
28b10 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20  * Size of pOrig 
28b20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20  region in bytes 
28b30 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20  */.  u8 *pNew = 
28b40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
28b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
28b60 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70  ation of new map
28b70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ping */.  int fl
28b80 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b  ags = PROT_READ;
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28ba0 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
28bb0 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20  to mmap() */..  
28bc0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
28bd0 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61  tchOut==0 );.  a
28be0 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d  ssert( nNew>pFd-
28bf0 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
28c00 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64  ssert( nNew<=pFd
28c10 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b  ->mmapSizeMax );
28c20 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
28c30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
28c40 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
28c50 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  al>=pFd->mmapSiz
28c60 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  e );.  assert( M
28c70 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a  AP_FAILED!=0 );.
28c80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
28c90 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20  MAP_READWRITE.  
28ca0 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c  if( (pFd->ctrlFl
28cb0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52  ags & UNIXFILE_R
28cc0 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67  DONLY)==0 ) flag
28cd0 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b  s |= PROT_WRITE;
28ce0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
28cf0 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45  Orig ){.#if HAVE
28d00 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20  _MREMAP.    i64 
28d10 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d  nReuse = pFd->mm
28d20 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20  apSize;.#else.  
28d30 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79    const int szSy
28d40 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67  spage = osGetpag
28d50 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34  esize();.    i64
28d60 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e   nReuse = (pFd->
28d70 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53  mmapSize & ~(szS
28d80 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64  yspage-1));.#end
28d90 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20  if.    u8 *pReq 
28da0 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d  = &pOrig[nReuse]
28db0 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20  ;..    /* Unmap 
28dc0 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68 65  any pages of the
28dd0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
28de0 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65  g that cannot be
28df0 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20   reused. */.    
28e00 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69  if( nReuse!=nOri
28e10 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e  g ){.      osMun
28e20 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d  map(pReq, nOrig-
28e30 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a  nReuse);.    }..
28e40 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a  #if HAVE_MREMAP.
28e50 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65      pNew = osMre
28e60 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73  map(pOrig, nReus
28e70 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f  e, nNew, MREMAP_
28e80 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45  MAYMOVE);.    zE
28e90 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23  rr = "mremap";.#
28ea0 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20  else.    pNew = 
28eb0 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65  osMmap(pReq, nNe
28ec0 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c  w-nReuse, flags,
28ed0 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20   MAP_SHARED, h, 
28ee0 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28  nReuse);.    if(
28ef0 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45   pNew!=MAP_FAILE
28f00 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  D ){.      if( p
28f10 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20  New!=pReq ){.   
28f20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e       osMunmap(pN
28f30 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73  ew, nNew - nReus
28f40 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
28f50 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
28f60 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  e{.        pNew 
28f70 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d  = pOrig;.      }
28f80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
28f90 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70     /* The attemp
28fa0 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  t to extend the 
28fb0 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
28fc0 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74   failed. Free it
28fd0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65  . */.    if( pNe
28fe0 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c  w==MAP_FAILED ||
28ff0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
29000 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67    osMunmap(pOrig
29010 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d  , nReuse);.    }
29020 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e  .  }..  /* If pN
29030 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c  ew is still NULL
29040 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  , try to create 
29050 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20  an entirely new 
29060 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  mapping. */.  if
29070 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
29080 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30   pNew = osMmap(0
29090 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d  , nNew, flags, M
290a0 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29  AP_SHARED, h, 0)
290b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65  ;.  }..  if( pNe
290c0 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w==MAP_FAILED ){
290d0 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
290e0 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20     nNew = 0;.   
290f0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
29100 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70  LITE_OK, zErr, p
29110 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20  Fd->zPath);..   
29120 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28   /* If the mmap(
29130 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20  ) above failed, 
29140 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20  assume that all 
29150 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28  subsequent mmap(
29160 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77  ) calls.    ** w
29170 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69  ill probably fai
29180 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b  l too. Fall back
29190 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f   to using xRead/
291a0 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76 65  xWrite exclusive
291b0 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69  ly.    ** in thi
291c0 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
291d0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
291e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d   = 0;.  }.  pFd-
291f0 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76  >pMapRegion = (v
29200 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46  oid *)pNew;.  pF
29210 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46  d->mmapSize = pF
29220 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
29230 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  l = nNew;.}../*.
29240 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72  ** Memory map or
29250 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20   remap the file 
29260 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64  opened by file-d
29270 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69  escriptor pFd (i
29280 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  f the file.** is
29290 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c   already mapped,
292a0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
292b0 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65  pping is replace
292c0 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f  d by the new). O
292d0 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20  r, if .** there 
292e0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
292f0 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69   mapping for thi
29300 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  s file, and ther
29310 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20  e are still .** 
29320 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
29330 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
29340 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
29350 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
29360 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
29370 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
29380 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
29390 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
293a0 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20  ted size of .** 
293b0 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63  the mapping to c
293c0 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  reate. Otherwise
293d0 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65  , if nByte is le
293e0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
293f0 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  en the .** reque
29400 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65  sted size is the
29410 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
29420 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61  e on disk. The a
29430 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
29440 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70  e.** created map
29450 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74  ping is either t
29460 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
29470 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63  e or the value c
29480 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73  onfigured .** us
29490 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ing SQLITE_FCNTL
294a0 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69  _MMAP_LIMIT, whi
294b0 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
294c0 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
294d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
294e0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
294f0 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
29500 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
29510 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
29520 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
29530 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
29540 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
29550 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
29560 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
29570 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c  c int unixMapfil
29580 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c  e(unixFile *pFd,
29590 20 69 36 34 20 6e 4d 61 70 29 7b 0a 20 20 61 73   i64 nMap){.  as
295a0 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c  sert( nMap>=0 ||
295b0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
295c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
295d0 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e  nMap>0 || (pFd->
295e0 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20 70  mmapSize==0 && p
295f0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d  Fd->pMapRegion==
29600 30 29 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d  0) );.  if( pFd-
29610 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
29620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29630 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
29640 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
29650 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
29660 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
29670 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
29680 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46  n */.    if( osF
29690 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74  stat(pFd->h, &st
296a0 61 74 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20  atbuf) ){.      
296b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
296c0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
296d0 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61 74  .    nMap = stat
296e0 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d  buf.st_size;.  }
296f0 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
29700 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
29710 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
29720 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
29730 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
29740 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a 20  SHARED_MAPPING. 
29750 20 69 66 28 20 70 46 64 2d 3e 70 49 6e 6f 64 65   if( pFd->pInode
29760 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64   ){.    unixInod
29770 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
29780 70 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20  pFd->pInode;.   
29790 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
297a0 67 69 6f 6e 20 29 20 72 65 74 75 72 6e 20 53 51  gion ) return SQ
297b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 75 6e 69  LITE_OK;.    uni
297c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
297d0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70     if( pInode->p
297e0 53 68 61 72 65 64 4d 61 70 70 69 6e 67 3d 3d 30  SharedMapping==0
297f0 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 4e   ){.      u8 *pN
29800 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e  ew = osMmap(0, n
29810 4d 61 70 2c 20 50 52 4f 54 5f 52 45 41 44 2c 20  Map, PROT_READ, 
29820 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 46 64 2d  MAP_SHARED, pFd-
29830 3e 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  >h, 0);.      if
29840 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
29850 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  ED ){.        un
29860 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
29870 45 5f 4f 4b 2c 20 22 6d 6d 61 70 22 2c 20 70 46  E_OK, "mmap", pF
29880 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
29890 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
298a0 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Max = 0;.      }
298b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
298c0 6e 6f 64 65 2d 3e 70 53 68 61 72 65 64 4d 61 70  node->pSharedMap
298d0 70 69 6e 67 20 3d 20 70 4e 65 77 3b 0a 20 20 20  ping = pNew;.   
298e0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
298f0 61 72 65 64 4d 61 70 70 69 6e 67 20 3d 20 6e 4d  aredMapping = nM
29900 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ap;.      }.    
29910 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52  }.    pFd->pMapR
29920 65 67 69 6f 6e 20 3d 20 70 49 6e 6f 64 65 2d 3e  egion = pInode->
29930 70 53 68 61 72 65 64 4d 61 70 70 69 6e 67 3b 0a  pSharedMapping;.
29940 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
29950 65 41 63 74 75 61 6c 20 3d 20 70 46 64 2d 3e 6d  eActual = pFd->m
29960 6d 61 70 53 69 7a 65 20 3d 20 70 49 6e 6f 64 65  mapSize = pInode
29970 2d 3e 6e 53 68 61 72 65 64 4d 61 70 70 69 6e 67  ->nSharedMapping
29980 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
29990 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75  utex();.    retu
299a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
299b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
299c0 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70  rt( nMap>0 || (p
299d0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20  Fd->mmapSize==0 
299e0 26 26 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  && pFd->pMapRegi
299f0 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  on==0) );.  if( 
29a00 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
29a10 69 7a 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 52  ize ){.    unixR
29a20 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d  emapfile(pFd, nM
29a30 61 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ap);.  }..  retu
29a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29a50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
29a60 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
29a70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
29a80 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
29a90 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
29aa0 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
29ab0 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
29ac0 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
29ad0 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
29ae0 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
29af0 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
29b00 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
29b10 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
29b20 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
29b30 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
29b40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
29b50 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
29b60 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
29b70 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
29b80 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
29b90 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
29ba0 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
29bb0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
29bc0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
29bd0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
29be0 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
29bf0 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
29c00 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
29c10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
29c20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
29c30 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
29c40 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
29c50 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72  eventually .** r
29c60 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
29c70 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  ence by calling 
29c80 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a  unixUnfetch()..*
29c90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
29ca0 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  xFetch(sqlite3_f
29cb0 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
29cc0 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69  f, int nAmt, voi
29cd0 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c  d **pp){.#if SQL
29ce0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
29cf0 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  E>0.  unixFile *
29d00 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  pFd = (unixFile 
29d10 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
29d20 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
29d30 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  se file */.#endi
29d40 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69  f.  *pp = 0;..#i
29d50 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
29d60 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
29d70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  Fd->mmapSizeMax>
29d80 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64  0 ){.    if( pFd
29d90 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20  ->pMapRegion==0 
29da0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
29db0 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
29dc0 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
29dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29de0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29df0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e   }.    if( pFd->
29e00 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66  mmapSize >= iOff
29e10 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a  +nAmt ){.      *
29e20 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64  pp = &((u8 *)pFd
29e30 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
29e40 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ff];.      pFd->
29e50 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20  nFetchOut++;.   
29e60 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
29e70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29e80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
29e90 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
29ea0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
29eb0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
29ec0 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20   releases a .** 
29ed0 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
29ee0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
29ef0 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74   call to unixFet
29f00 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
29f10 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
29f20 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
29f30 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
29f40 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
29f50 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
29f60 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
29f70 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e  passed to the un
29f80 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61  ixFetch() invoca
29f90 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c  tion. .**.** Or,
29fa0 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
29fb0 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
29fc0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
29fd0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
29fe0 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d  ed .** to inform
29ff0 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74   the VFS layer t
2a000 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  hat, according t
2a010 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69  o POSIX, any exi
2a020 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a  sting mapping .*
2a030 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76  * may now be inv
2a040 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
2a050 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a  be unmapped..*/.
2a060 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
2a070 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
2a080 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
2a090 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66  f, void *p){.#if
2a0a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
2a0b0 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
2a0c0 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
2a0d0 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
2a0e0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
2a0f0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2a100 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a110 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49  R(iOff);..  /* I
2a120 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
2a130 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
2a140 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
2a150 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
2a160 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65   .  ** xFetch re
2a170 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66  ferences. Or, if
2a180 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69   p!=0 (meaning i
2a190 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72  t is an xFetch r
2a1a0 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20  eference),.  ** 
2a1b0 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
2a1c0 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
2a1d0 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f  outstanding.  */
2a1e0 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30  .  assert( (p==0
2a1f0 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f  )==(pFd->nFetchO
2a200 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ut==0) );..  /* 
2a210 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74  If p!=0, it must
2a220 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20   match the iOff 
2a230 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65  value. */.  asse
2a240 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26  rt( p==0 || p==&
2a250 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
2a260 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b  Region)[iOff] );
2a270 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
2a280 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
2a290 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
2a2a0 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
2a2b0 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  d);.  }..  asser
2a2c0 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
2a2d0 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20  t>=0 );.#else.  
2a2e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a2f0 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
2a300 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55  ARAMETER(p);.  U
2a310 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a320 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20  iOff);.#endif.  
2a330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  ;.}../*.** Here 
2a350 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
2a360 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
2a370 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
2a380 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
2a390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
2a3a0 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
2a3b0 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
2a3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3d0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
2a3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a420 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
2a430 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
2a440 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
2a450 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f  s of sqlite3_io_
2a460 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
2a470 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  that.** implemen
2a480 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c  t various file l
2a490 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
2a4a0 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74  s.  It also cont
2a4b0 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
2a4c0 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20  .** of "finder" 
2a4d0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69  functions.  A fi
2a4e0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
2a4f0 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20   used to locate 
2a500 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
2a510 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ** sqlite3_io_me
2a520 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72  thods object for
2a530 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2a540 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
2a550 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69  e pAppData.** fi
2a560 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
2a570 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63  e3_vfs VFS objec
2a580 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ts are initializ
2a590 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72  ed to be pointer
2a5a0 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72  s to.** the corr
2a5b0 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ect finder-funct
2a5c0 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53  ion for that VFS
2a5d0 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e  ..**.** Most fin
2a5e0 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  der functions re
2a5f0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2a600 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
2a610 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
2a620 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c  object.  The onl
2a630 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69  y interesting fi
2a640 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73  nder-function is
2a650 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2a660 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b  r, which.** look
2a670 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73  s at the filesys
2a680 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69  tem type and tri
2a690 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20  es to guess the 
2a6a0 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  best locking.** 
2a6b0 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68  strategy from th
2a6c0 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69  at..**.** For fi
2a6d0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c  nder-function F,
2a6e0 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
2a6f0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
2a700 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
2a710 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
2a720 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
2a730 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
2a740 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
2a750 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2a760 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
2a770 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
2a780 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
2a790 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
2a7a0 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
2a7b0 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
2a7c0 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
2a7d0 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
2a7e0 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
2a7f0 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
2a800 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
2a810 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
2a820 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
2a830 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
2a840 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
2a850 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
2a860 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
2a870 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
2a880 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
2a890 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
2a8a0 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
2a8b0 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
2a8c0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2a8d0 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
2a8e0 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
2a8f0 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
2a900 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
2a910 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
2a920 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
2a930 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
2a940 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
2a950 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
2a960 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
2a970 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
2a980 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
2a990 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
2a9a0 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
2a9b0 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
2a9c0 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e  R,METHOD,VERSION
2a9d0 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f  ,CLOSE,LOCK,UNLO
2a9e0 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50  CK,CKLOCK,SHMMAP
2a9f0 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63  )     \.static c
2aa00 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2aa10 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
2aa20 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa40 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f       \.   VERSIO
2aa50 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
2aa60 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
2aa70 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
2aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa90 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aab0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
2aac0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aae0 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
2aaf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ab00 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab30 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
2ab40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ab50 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab80 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
2ab90 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
2aba0 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
2abb0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abd0 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
2abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abf0 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2ac20 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
2ac30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ac40 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2ac70 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac90 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2acc0 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ace0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad00 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2ad10 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
2ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad30 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2ad40 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
2ad50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2ad60 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
2ad70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ad80 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ada0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2adb0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
2adc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2add0 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
2ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adf0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2ae00 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
2ae10 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
2ae20 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
2ae30 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2ae40 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d          \.   SHM
2ae50 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20 20 20  MAP,            
2ae60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2ae70 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Map */          
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae90 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2aea0 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
2aeb0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
2aec0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
2aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aee0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
2aef0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
2af00 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
2af10 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20  rrier */        
2af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af30 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
2af40 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mUnmap,         
2af50 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
2af60 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
2af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af80 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74      \.   unixFet
2af90 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
2afa0 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a       /* xFetch *
2afb0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afd0 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65     \.   unixUnfe
2afe0 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
2aff0 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20      /* xUnfetch 
2b000 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b020 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20    \.};          
2b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b070 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
2b080 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2b090 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c  ds *FINDER##Impl
2b0a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
2b0b0 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20  unixFile *p){   
2b0c0 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  \.  UNUSED_PARAM
2b0d0 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f  ETER(z); UNUSED_
2b0e0 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20  PARAMETER(p);   
2b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2b110 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f  .  return &METHO
2b120 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b160 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
2b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
2b1b0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2b1c0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2b1d0 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28  (*const FINDER)(
2b1e0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2b1f0 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20  File *p)    \.  
2b200 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c    = FINDER##Impl
2b210 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72  ;../*.** Here ar
2b220 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c  e all of the sql
2b230 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b240 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
2b250 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69   of the.** locki
2b260 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
2b270 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  Functions that r
2b280 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74  eturn pointers t
2b290 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a  o these methods.
2b2a0 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61  ** are also crea
2b2b0 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44  ted..*/.IOMETHOD
2b2c0 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  S(.  posixIoFind
2b2d0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
2b2e0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2b2f0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69  n name */.  posi
2b300 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  xIoMethods,     
2b310 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2b320 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2b330 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b350 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2b360 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70   memory and mmap
2b370 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   are enabled */.
2b380 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
2b390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b3a0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2b3b0 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b3d0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2b3e0 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20   unixUnlock,    
2b3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2b400 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2b410 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
2b420 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78  vedLock,    /* x
2b430 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b440 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
2b450 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20  ixShmMap        
2b460 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2b470 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ap method */.).I
2b480 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f  OMETHODS(.  nolo
2b490 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
2b4a0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2b4b0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2b4c0 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  .  nolockIoMetho
2b4d0 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ds,          /* 
2b4e0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2b4f0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2b500 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  /.  3,          
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b520 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2b530 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2b540 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  nolockClose,    
2b550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2b560 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2b570 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  nolockLock,     
2b580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2b590 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
2b5a0 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  olockUnlock,    
2b5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2b5c0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2b5d0 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
2b5e0 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68  vedLock,  /* xCh
2b5f0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2b600 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b620 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2b630 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
2b640 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
2b650 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
2b660 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
2b670 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
2b680 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
2b690 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
2b6a0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2b6b0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
2b6c0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
2b6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2b6e0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
2b6f0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
2b700 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
2b710 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2b720 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
2b730 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
2b740 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
2b750 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
2b760 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
2b770 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2b780 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
2b790 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
2b7a0 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63  edLock, /* xChec
2b7b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
2b7c0 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
2b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7e0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
2b7f0 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20  ethod */.)..#if 
2b800 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2b810 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
2b820 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
2b830 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2b840 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2b850 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2b860 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
2b870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2b880 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b890 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2b8a0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2b8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2b8c0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2b8d0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
2b8e0 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
2b8f0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2b900 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
2b910 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
2b920 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2b930 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
2b940 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
2b950 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2b960 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
2b970 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
2b980 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock,   /* xCheck
2b990 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2b9a0 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9c0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2b9d0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2b9e0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
2b9f0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65  .IOMETHODS(.  se
2ba00 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  mIoFinder,      
2ba10 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2ba20 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2ba30 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64  */.  semIoMethod
2ba40 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
2ba50 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2ba60 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2ba70 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba90 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2baa0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2bab0 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20    semXClose,    
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2bad0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2bae0 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20    semXLock,     
2baf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2bb00 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2bb10 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20   semXUnlock,    
2bb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2bb30 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2bb40 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72    semXCheckReser
2bb50 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78  vedLock,    /* x
2bb60 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2bb70 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb90 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2bba0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2bbb0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
2bbc0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2bbd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2bbe0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
2bbf0 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46  ETHODS(.  afpIoF
2bc00 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
2bc10 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
2bc20 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
2bc30 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20   afpIoMethods,  
2bc40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
2bc50 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2bc60 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
2bc70 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
2bc80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2bc90 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
2bca0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66  disabled */.  af
2bcb0 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  pClose,         
2bcc0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2bcd0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  e method */.  af
2bce0 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  pLock,          
2bcf0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
2bd00 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
2bd10 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2bd20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2bd30 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
2bd40 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
2bd50 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck,     /* xChec
2bd60 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
2bd70 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
2bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd90 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
2bda0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
2bdb0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  f../*.** The pro
2bdc0 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  xy locking metho
2bdd0 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65  d is a "super-me
2bde0 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e  thod" in the sen
2bdf0 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70  se that it.** op
2be00 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69  ens secondary fi
2be10 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
2be20 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64  or the conch and
2be30 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a   lock files and.
2be40 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79  ** it uses proxy
2be50 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c  , dot-file, AFP,
2be60 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63   and flock() loc
2be70 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
2be80 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61  those.** seconda
2be90 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74  ry files.  For t
2bea0 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
2beb0 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
2bec0 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78  plements.** prox
2bed0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63  y locking is loc
2bee0 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65  ated much furthe
2bef0 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69  r down in the fi
2bf00 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  le.  But we need
2bf10 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
2bf20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73  and define the s
2bf30 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2bf40 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e  s and finder fun
2bf50 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f  ction.** for pro
2bf60 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e  xy locking here.
2bf70 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20    So we forward 
2bf80 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20  declare the I/O 
2bf90 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20  methods..*/.#if 
2bfa0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2bfb0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2bfc0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2bfd0 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  E.static int pro
2bfe0 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
2bff0 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
2c000 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
2c010 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
2c020 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
2c030 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
2c040 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
2c050 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
2c060 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2c070 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
2c080 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28  nt*);.IOMETHODS(
2c090 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72  .  proxyIoFinder
2c0a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2c0b0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2c0c0 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49  name */.  proxyI
2c0d0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2c0e0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2c0f0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2c100 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c120 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2c130 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2c140 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73  d */.  proxyClos
2c150 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2c160 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2c170 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  d */.  proxyLock
2c180 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c190 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2c1a0 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63   */.  proxyUnloc
2c1b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2c1c0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2c1d0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63  d */.  proxyChec
2c1e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2c1f0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2c200 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2c210 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
2c220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c230 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2c240 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e  /.).#endif../* n
2c250 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20  fs lockd on OSX 
2c260 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c  10.3+ doesn't cl
2c270 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  ear write locks 
2c280 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
2c290 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64   is set */.#if d
2c2a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2c2b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2c2c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2c2d0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66  .IOMETHODS(.  nf
2c2e0 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  sIoFinder,      
2c2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
2c300 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
2c310 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f   */.  nfsIoMetho
2c320 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
2c330 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2c340 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2c350 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c370 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2c380 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2c390 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3b0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2c3c0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3e0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2c3f0 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c   */.  nfsUnlock,
2c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c410 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2c420 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
2c430 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2c440 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2c450 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2c460 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c480 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
2c490 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
2c4a0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2c4b0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2c4c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2c4d0 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  TYLE./* .** This
2c4e0 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
2c4f0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  on attempts to d
2c500 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73  etermine the bes
2c510 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  t locking strate
2c520 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64  gy .** for the d
2c530 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69  atabase file "fi
2c540 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65  lePath".  It the
2c550 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71  n returns the sq
2c560 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2c570 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
2c580 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  implements that 
2c590 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20  strategy..**.** 
2c5a0 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f  This is for MacO
2c5b0 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  SX only..*/.stat
2c5c0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2c5d0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
2c5e0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
2c5f0 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
2c600 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
2c610 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2c620 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2c630 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
2c640 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e           /* open
2c650 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72   file object for
2c660 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c670 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  le */.){.  stati
2c680 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d  c const struct M
2c690 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e  apping {.    con
2c6a0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79  st char *zFilesy
2c6b0 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  stem;           
2c6c0 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d     /* Filesystem
2c6d0 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   type name */.  
2c6e0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
2c6f0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
2c700 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f  hods;   /* Appro
2c710 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
2c720 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61  ethod */.  } aMa
2c730 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68  p[] = {.    { "h
2c740 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
2c750 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2c760 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "ufs",    &posi
2c770 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
2c780 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61    { "afpfs",  &a
2c790 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
2c7a0 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26     { "smbfs",  &
2c7b0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
2c7c0 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20      { "webdav", 
2c7d0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2c7e0 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d   },.    { 0, 0 }
2c7f0 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
2c800 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
2c810 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  sInfo;.  struct 
2c820 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
2c830 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
2c840 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
2c850 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
2c860 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
2c870 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
2c880 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
2c890 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
2c8a0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
2c8b0 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
2c8c0 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2c8d0 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ods;.  }.  if( s
2c8e0 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20  tatfs(filePath, 
2c8f0 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29  &fsInfo) != -1 )
2c900 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f  {.    if( fsInfo
2c910 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52  .f_flags & MNT_R
2c920 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72  DONLY ){.      r
2c930 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2c940 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
2c950 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b    for(i=0; aMap[
2c960 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20  i].zFilesystem; 
2c970 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
2c980 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
2c990 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70  fstypename, aMap
2c9a0 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29  [i].zFilesystem)
2c9b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2c9c0 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d  eturn aMap[i].pM
2c9d0 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a  ethods;.      }.
2c9e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2c9f0 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61  Default case. Ha
2ca00 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f  ndles, amongst o
2ca10 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20  thers, "nfs"..  
2ca20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e  ** Test byte-ran
2ca30 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63  ge lock using fc
2ca40 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61  ntl(). If the ca
2ca50 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20  ll succeeds, .  
2ca60 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  ** assume that t
2ca70 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2ca80 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74  upports POSIX st
2ca90 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f  yle locks. .  */
2caa0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65  .  lockInfo.l_le
2cab0 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66  n = 1;.  lockInf
2cac0 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  o.l_start = 0;. 
2cad0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e   lockInfo.l_when
2cae0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
2caf0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65   lockInfo.l_type
2cb00 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66   = F_RDLCK;.  if
2cb10 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e  ( osFcntl(pNew->
2cb20 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
2cb30 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
2cb40 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
2cb50 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
2cb60 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a  e, "nfs")==0 ){.
2cb70 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66        return &nf
2cb80 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  sIoMethods;.    
2cb90 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
2cba0 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
2cbb0 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  thods;.    }.  }
2cbc0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2cbd0 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
2cbe0 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2cbf0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2cc00 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2cc10 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
2cc20 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
2cc30 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
2cc40 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2cc50 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2cc60 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
2cc70 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2cc80 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2cc90 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56  YLE */..#if OS_V
2cca0 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69  XWORKS./*.** Thi
2ccb0 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
2ccc0 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73 20  ion for VxWorks 
2ccd0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
2cce0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 0a   posix advisory.
2ccf0 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  ** locking works
2cd00 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  .  If it does, t
2cd10 68 65 6e 20 74 68 61 74 20 69 73 20 77 68 61 74  hen that is what
2cd20 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 69 74   is used.  If it
2cd30 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72   does not.** wor
2cd40 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b  k, then fallback
2cd50 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70 68   to named semaph
2cd60 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ore locking..*/.
2cd70 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2cd80 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2cd90 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72  *vxworksIoFinder
2cda0 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
2cdb0 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
2cdc0 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
2cdd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2cde0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2cdf0 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
2ce00 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
2ce10 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
2ce20 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
2ce30 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
2ce40 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
2ce50 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
2ce60 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
2ce70 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2ce80 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
2ce90 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
2cea0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2ceb0 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
2cec0 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
2ced0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
2cee0 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
2cef0 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
2cf00 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
2cf10 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
2cf20 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
2cf30 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
2cf40 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
2cf50 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
2cf60 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
2cf70 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
2cf80 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
2cf90 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
2cfa0 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
2cfb0 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
2cfc0 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
2cfd0 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
2cfe0 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
2cff0 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
2d000 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
2d010 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2d020 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
2d030 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
2d040 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2d050 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
2d060 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f 46  const vxworksIoF
2d070 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
2d080 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
2d090 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49  vxworksIoFinderI
2d0a0 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
2d0b0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f  OS_VXWORKS */../
2d0c0 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74  *.** An abstract
2d0d0 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e   type for a poin
2d0e0 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74  ter to an IO met
2d0f0 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
2d100 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
2d110 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2d120 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
2d130 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
2d140 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
2d150 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
2d160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d1a0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2d1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
2d1c0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
2d1d0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
2d1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2d1f0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
2d200 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
2d210 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2d220 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
2d230 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
2d240 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
2d250 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2d260 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d270 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2d280 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
2d290 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
2d2a0 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
2d2b0 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
2d2c0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
2d2d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
2d2e0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2d2f0 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
2d300 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
2d310 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
2d320 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2d330 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
2d340 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
2d350 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
2d360 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
2d370 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
2d380 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2d390 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
2d3a0 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
2d3b0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74  ened */.  int ct
2d3c0 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
2d3d0 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
2d3e0 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c  e UNIXFILE_* val
2d3f0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ues */.){.  cons
2d400 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2d410 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74  hods *pLockingSt
2d420 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
2d430 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
2d440 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
2d450 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2d460 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2d470 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a  pInode==NULL );.
2d480 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67  .  /* No locking
2d490 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f   occurs in tempo
2d4a0 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rary files */.  
2d4b0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
2d4c0 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61  e!=0 || (ctrlFla
2d4d0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
2d4e0 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f  LOCK)!=0 );..  O
2d4f0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
2d500 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
2d510 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
2d520 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
2d530 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  ew->pVfs = pVfs;
2d540 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d  .  pNew->zPath =
2d550 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e   zFilename;.  pN
2d560 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20  ew->ctrlFlags = 
2d570 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23  (u8)ctrlFlags;.#
2d580 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
2d590 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77  AP_SIZE>0.  pNew
2d5a0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
2d5b0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2d5c0 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64  fig.szMmap;.#end
2d5d0 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
2d5e0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63  _uri_boolean(((c
2d5f0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
2d600 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65  ILE_URI) ? zFile
2d610 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20  name : 0),.     
2d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d630 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51        "psow", SQ
2d640 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f  LITE_POWERSAFE_O
2d650 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20  VERWRITE) ){.   
2d660 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2d670 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f   |= UNIXFILE_PSO
2d680 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  W;.  }.  if( str
2d690 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  cmp(pVfs->zName,
2d6a0 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20  "unix-excl")==0 
2d6b0 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
2d6c0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2d6d0 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69  LE_EXCL;.  }..#i
2d6e0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70  f OS_VXWORKS.  p
2d6f0 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72  New->pId = vxwor
2d700 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69  ksFindFileId(zFi
2d710 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
2d720 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20  New->pId==0 ){. 
2d730 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2d740 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b  UNIXFILE_NOLOCK;
2d750 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2d760 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
2d770 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
2d780 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
2d790 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20  ILE_NOLOCK ){.  
2d7a0 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
2d7b0 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  = &nolockIoMetho
2d7c0 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
2d7d0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2d7e0 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65   (**(finder_type
2d7f0 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  *)pVfs->pAppData
2d800 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  )(zFilename, pNe
2d810 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  w);.#if SQLITE_E
2d820 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2d830 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65  YLE.    /* Cache
2d840 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68   zFilename in th
2d850 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
2d860 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f  t (AFP and dotlo
2d870 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72  ck override) for
2d880 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63  .    ** proxyLoc
2d890 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20  k activation is 
2d8a0 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65  possible (remote
2d8b0 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20   proxy is based 
2d8c0 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20  on db name).    
2d8d0 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d  ** zFilename rem
2d8e0 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
2d8f0 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c   file is closed,
2d900 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20   to support */. 
2d910 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2d920 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a  Context = (void*
2d930 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64  )zFilename;.#end
2d940 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  if.  }..  if( pL
2d950 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2d960 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23  posixIoMethods.#
2d970 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2d980 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2d990 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2d9a0 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63  TYLE.    || pLoc
2d9b0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66  kingStyle == &nf
2d9c0 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69  sIoMethods.#endi
2d9d0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2d9e0 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47 0a 20  SHARED_MAPPING. 
2d9f0 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74     || pLockingSt
2da00 79 6c 65 20 3d 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  yle == &nolockIo
2da10 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20  Methods.#endif. 
2da20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   ){.    unixEnte
2da30 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
2da40 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2da50 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2da60 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  node);.    if( r
2da70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2da80 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65        /* If an e
2da90 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
2daa0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2dab0 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
2dac0 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
2dad0 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
2dae0 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
2daf0 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
2db00 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61  ndInodeInfo() ma
2db10 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20  y fail.      ** 
2db20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
2db30 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
2db40 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c   **   (a) A call
2db50 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c   to fstat() fail
2db60 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  ed..      **   (
2db70 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  b) A malloc fail
2db80 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2db90 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28     ** Scenario (
2dba0 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  b) may only occu
2dbb0 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  r if the process
2dbc0 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f   is holding no o
2dbd0 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69  ther.      ** fi
2dbe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
2dbf0 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2dc00 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77  file. If there w
2dc10 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20  ere other file. 
2dc20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
2dc30 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ors on this file
2dc40 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63  , then no malloc
2dc50 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72   would be requir
2dc60 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66  ed by.      ** f
2dc70 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20  indInodeInfo(). 
2dc80 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
2dc90 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
2dca0 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
2dcb0 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
2dcc0 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
2dcd0 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
2dce0 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
2dcf0 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
2dd00 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
2dd10 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2dd20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
2dd30 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
2dd40 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
2dd50 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
2dd60 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
2dd70 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
2dd80 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
2dd90 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
2dda0 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
2ddb0 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
2ddc0 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
2ddd0 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
2dde0 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
2ddf0 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
2de00 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  /.      robust_c
2de10 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2de20 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68  LINE__);.      h
2de30 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2de40 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2de50 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
2de60 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2de70 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2de80 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
2de90 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2dea0 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
2deb0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2dec0 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
2ded0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2dee0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2def0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
2df00 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
2df10 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
2df20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
2df30 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
2df40 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2df50 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
2df60 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2df70 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  c64( sizeof(*pCt
2df80 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  x) );.    if( pC
2df90 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  tx==0 ){.      r
2dfa0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2dfb0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
2dfc0 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a  {.      /* NB: z
2dfd0 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20  Filename exists 
2dfe0 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  and remains vali
2dff0 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65  d until the file
2e000 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20   is closed.     
2e010 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   ** according to
2e020 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31   requirement F11
2e030 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  141.  So we do n
2e040 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
2e050 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
2e060 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e  of the filename.
2e070 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   */.      pCtx->
2e080 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  dbPath = zFilena
2e090 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  me;.      pCtx->
2e0a0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
2e0b0 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
2e0c0 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65  ;.      unixEnte
2e0d0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  rMutex();.      
2e0e0 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2e0f0 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2e100 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  pInode);.      i
2e110 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e120 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2e130 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
2e140 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
2e150 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
2e160 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2e170 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
2e180 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d   h = -1;.      }
2e190 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65  .      unixLeave
2e1a0 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20  Mutex();        
2e1b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2e1c0 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  f..  else if( pL
2e1d0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2e1e0 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
2e1f0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69   ){.    /* Dotfi
2e200 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  le locking uses 
2e210 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2e220 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
2e230 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
2e240 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f  ** the dotlockLo
2e250 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20  ckingContext .  
2e260 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
2e270 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e  LockFile;.    in
2e280 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  t nFilename;.   
2e290 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2e2a0 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69  me!=0 );.    nFi
2e2b0 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74  lename = (int)st
2e2c0 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20  rlen(zFilename) 
2e2d0 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69  + 6;.    zLockFi
2e2e0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  le = (char *)sql
2e2f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46  ite3_malloc64(nF
2e300 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
2e310 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29  ( zLockFile==0 )
2e320 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2e330 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2e340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e350 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2e360 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f  f(nFilename, zLo
2e370 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54  ckFile, "%s" DOT
2e380 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69  LOCK_SUFFIX, zFi
2e390 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  lename);.    }. 
2e3a0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2e3b0 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46  Context = zLockF
2e3c0 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  ile;.  }..#if OS
2e3d0 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20  _VXWORKS.  else 
2e3e0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2e3f0 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f  e == &semIoMetho
2e400 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d  ds ){.    /* Nam
2e410 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
2e420 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2e430 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2e440 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
2e450 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
2e460 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   semLockingConte
2e470 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  xt.    */.    un
2e480 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2e490 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2e4a0 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2e4b0 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2e4c0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
2e4d0 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70  _OK) && (pNew->p
2e4e0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c  Inode->pSem==NUL
2e4f0 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  L) ){.      char
2e500 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65   *zSemName = pNe
2e510 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2e520 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
2e530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2e540 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
2e550 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
2e560 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20   "/%s.sem",.    
2e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e580 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43     pNew->pId->zC
2e590 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
2e5a0 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a       for( n=1; z
2e5b0 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20  SemName[n]; n++ 
2e5c0 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  ).        if( zS
2e5d0 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29  emName[n]=='/' )
2e5e0 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27   zSemName[n] = '
2e5f0 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  _';.      pNew->
2e600 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73  pInode->pSem = s
2e610 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65  em_open(zSemName
2e620 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c  , O_CREAT, 0666,
2e630 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
2e640 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2e650 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20  m == SEM_FAILED 
2e660 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2e670 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2e680 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  T;.        pNew-
2e690 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
2e6a0 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
2e6b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
2e6c0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2e6d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
2e6e0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
2e6f0 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53  pNew, 0);.#if OS
2e700 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
2e710 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e720 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
2e730 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2e740 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2e750 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2e760 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61  osUnlink(zFilena
2e770 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  me);.    pNew->c
2e780 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2e790 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d  FILE_DELETE;.  }
2e7a0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
2e7b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e7c0 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
2e7d0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2e7e0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2e7f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
2e800 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63  ->pMethod = pLoc
2e810 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f  kingStyle;.    O
2e820 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
2e830 20 20 20 20 76 65 72 69 66 79 44 62 46 69 6c 65      verifyDbFile
2e840 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65  (pNew);.  }.  re
2e850 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e860 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
2e870 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
2e880 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74   in which to put
2e890 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
2e8a0 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  ..** If no suita
2e8b0 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ble temporary fi
2e8c0 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e  le directory can
2e8d0 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
2e8e0 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
2e8f0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
2e900 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f  ixTempFileDir(vo
2e910 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
2e920 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
2e930 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20  [] = {.     0,. 
2e940 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61      0,.     "/va
2e950 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
2e960 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
2e970 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a 20  tmp",.     ".". 
2e980 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
2e990 6e 74 20 69 20 3d 20 30 3b 0a 20 20 73 74 72 75  nt i = 0;.  stru
2e9a0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63  ct stat buf;.  c
2e9b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
2e9c0 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  = sqlite3_temp_d
2e9d0 69 72 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28  irectory;..  if(
2e9e0 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a   !azDirs[0] ) az
2e9f0 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76  Dirs[0] = getenv
2ea00 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22  ("SQLITE_TMPDIR"
2ea10 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  );.  if( !azDirs
2ea20 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20  [1] ) azDirs[1] 
2ea30 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
2ea40 22 29 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  ");.  while(1){.
2ea50 20 20 20 20 69 66 28 20 7a 44 69 72 21 3d 30 0a      if( zDir!=0.
2ea60 20 20 20 20 20 26 26 20 6f 73 53 74 61 74 28 7a       && osStat(z
2ea70 44 69 72 2c 20 26 62 75 66 29 3d 3d 30 0a 20 20  Dir, &buf)==0.  
2ea80 20 20 20 26 26 20 53 5f 49 53 44 49 52 28 62 75     && S_ISDIR(bu
2ea90 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20  f.st_mode).     
2eaa0 26 26 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72  && osAccess(zDir
2eab0 2c 20 30 33 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  , 03)==0.    ){.
2eac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 7a 44 69        return zDi
2ead0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
2eae0 20 69 3e 3d 73 69 7a 65 6f 66 28 61 7a 44 69 72   i>=sizeof(azDir
2eaf0 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
2eb00 5b 30 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  [0]) ) break;.  
2eb10 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b    zDir = azDirs[
2eb20 69 2b 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  i++];.  }.  retu
2eb30 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
2eb40 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
2eb50 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
2eb60 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
2eb70 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
2eb80 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
2eb90 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
2eba0 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
2ebb0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
2ebc0 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
2ebd0 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
2ebe0 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
2ebf0 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
2ec00 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2ec10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
2ec20 72 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  r;.  int iLimit 
2ec30 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  = 0;..  /* It's 
2ec40 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2ec50 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2ec60 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2ec70 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2ec80 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2ec90 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2eca0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2ecb0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2ecc0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2ecd0 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
2ece0 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20   zBuf[0] = 0;.  
2ecf0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2ed00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2ed10 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20  OERR );..  zDir 
2ed20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69  = unixTempFileDi
2ed30 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d  r();.  if( zDir=
2ed40 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2ed50 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
2ed60 50 41 54 48 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  PATH;.  do{.    
2ed70 75 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74  u64 r;.    sqlit
2ed80 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
2ed90 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
2eda0 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 32    assert( nBuf>2
2edb0 20 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75   );.    zBuf[nBu
2edc0 66 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  f-2] = 0;.    sq
2edd0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2ede0 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  Buf, zBuf, "%s/"
2edf0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
2ee00 5f 50 52 45 46 49 58 22 25 6c 6c 78 25 63 22 2c  _PREFIX"%llx%c",
2ee10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ee20 20 20 20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30        zDir, r, 0
2ee30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 5b  );.    if( zBuf[
2ee40 6e 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69  nBuf-2]!=0 || (i
2ee50 4c 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72 65  Limit++)>10 ) re
2ee60 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2ee70 52 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  R;.  }while( osA
2ee80 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
2ee90 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2eea0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
2eeb0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2eec0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
2eed0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2eee0 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
2eef0 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
2ef00 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
2ef10 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
2ef20 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
2ef30 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
2ef40 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
2ef50 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
2ef60 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
2ef70 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
2ef80 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
2ef90 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
2efa0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
2efb0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
2efc0 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
2efd0 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
2efe0 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
2eff0 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
2f000 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
2f010 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
2f020 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
2f030 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
2f040 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
2f050 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
2f060 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
2f070 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
2f080 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
2f090 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
2f0a0 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
2f0b0 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
2f0c0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2f0d0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
2f0e0 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
2f0f0 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
2f100 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
2f110 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
2f120 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
2f130 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
2f140 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
2f150 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
2f160 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
2f170 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
2f180 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
2f190 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
2f1a0 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
2f1b0 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
2f1c0 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
2f1d0 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
2f1e0 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
2f1f0 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
2f200 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
2f210 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
2f220 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2f230 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
2f240 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
2f250 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
2f260 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
2f270 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
2f280 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
2f290 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
2f2a0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
2f2b0 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
2f2c0 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
2f2d0 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
2f2e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
2f2f0 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
2f300 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
2f310 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
2f320 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
2f330 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
2f340 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
2f350 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
2f360 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
2f370 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
2f380 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
2f390 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
2f3a0 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
2f3b0 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
2f3c0 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
2f3d0 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
2f3e0 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
2f3f0 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
2f400 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
2f410 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
2f420 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
2f430 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
2f440 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
2f450 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
2f460 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
2f470 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
2f480 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
2f490 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
2f4a0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
2f4b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
2f4c0 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
2f4d0 6c 6c 20 2a 2f 0a 0a 20 20 75 6e 69 78 45 6e 74  ll */..  unixEnt
2f4e0 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
2f4f0 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d   A stat() call m
2f500 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69  ay fail for vari
2f510 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20  ous reasons. If 
2f520 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74  this happens, it
2f530 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20   is.  ** almost 
2f540 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20  certain that an 
2f550 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74  open() call on t
2f560 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c  he same path wil
2f570 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a  l also fail..  *
2f580 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f  * For this reaso
2f590 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  n, if an error o
2f5a0 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61  ccurs in the sta
2f5b0 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69  t() call here, i
2f5c0 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65  t is.  ** ignore
2f5d0 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75  d and -1 is retu
2f5e0 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
2f5f0 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65   will try to ope
2f600 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  n a new file.  *
2f610 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  * descriptor on 
2f620 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66  the same path, f
2f630 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  ail, and return 
2f640 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69  an error to SQLi
2f650 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76  te..  **.  ** Ev
2f660 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65  en if a subseque
2f670 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64  nt open() call d
2f680 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65  oes succeed, the
2f690 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66   consequences of
2f6a0 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68  .  ** not search
2f6b0 69 6e 67 20 66 6f 72 20 61 20 72 65 75 73 61 62  ing for a reusab
2f6c0 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
2f6d0 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e  or are not dire.
2f6e0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 55 6e 75 73    */.  if( nUnus
2f6f0 65 64 46 64 3e 30 20 26 26 20 30 3d 3d 6f 73 53  edFd>0 && 0==osS
2f700 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61  tat(zPath, &sSta
2f710 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e  t) ){.    unixIn
2f720 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
2f730 0a 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69  ..    pInode = i
2f740 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68  nodeList;.    wh
2f750 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28  ile( pInode && (
2f760 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64  pInode->fileId.d
2f770 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76  ev!=sStat.st_dev
2f780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f790 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d        || pInode-
2f7a0 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 28 75 36  >fileId.ino!=(u6
2f7b0 34 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20  4)sStat.st_ino) 
2f7c0 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ){.       pInode
2f7d0 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
2f7e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f7f0 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  pInode ){.      
2f800 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70  UnixUnusedFd **p
2f810 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d  p;.      for(pp=
2f820 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  &pInode->pUnused
2f830 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e  ; *pp && (*pp)->
2f840 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70  flags!=flags; pp
2f850 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
2f860 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  );.      pUnused
2f870 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66   = *pp;.      if
2f880 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
2f890 20 20 20 20 20 6e 55 6e 75 73 65 64 46 64 2d 2d       nUnusedFd--
2f8a0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  ;.        *pp = 
2f8b0 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a  pUnused->pNext;.
2f8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f8d0 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
2f8e0 65 78 28 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ex();.#endif    
2f8f0 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /* if !OS_VXWORK
2f900 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55  S */.  return pU
2f910 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nused;.}../*.** 
2f920 46 69 6e 64 20 74 68 65 20 6d 6f 64 65 2c 20 75  Find the mode, u
2f930 69 64 20 61 6e 64 20 67 69 64 20 6f 66 20 66 69  id and gid of fi
2f940 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a 2f 0a 73 74  le zFile. .*/.st
2f950 61 74 69 63 20 69 6e 74 20 67 65 74 46 69 6c 65  atic int getFile
2f960 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  Mode(.  const ch
2f970 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20  ar *zFile,      
2f980 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
2f990 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  name */.  mode_t
2f9a0 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20   *pMode,        
2f9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2f9c0 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  : Permissions of
2f9d0 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 75 69 64 5f   zFile */.  uid_
2f9e0 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20  t *pUid,        
2f9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2fa00 55 54 3a 20 75 69 64 20 6f 66 20 7a 46 69 6c 65  UT: uid of zFile
2fa10 2e 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  . */.  gid_t *pG
2fa20 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
2fa30 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
2fa40 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a  id of zFile. */.
2fa50 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  ){.  struct stat
2fa60 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
2fa70 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
2fa80 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
2fa90 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2faa0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2fab0 4b 3b 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  K;.  if( 0==osSt
2fac0 61 74 28 7a 46 69 6c 65 2c 20 26 73 53 74 61 74  at(zFile, &sStat
2fad0 29 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20  ) ){.    *pMode 
2fae0 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20  = sStat.st_mode 
2faf0 26 20 30 37 37 37 3b 0a 20 20 20 20 2a 70 55 69  & 0777;.    *pUi
2fb00 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64  d = sStat.st_uid
2fb10 3b 0a 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53  ;.    *pGid = sS
2fb20 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 7d 65  tat.st_gid;.  }e
2fb30 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
2fb40 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
2fb50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2fb60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2fb70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2fb80 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  led by unixOpen(
2fb90 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  ) to determine t
2fba0 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69  he unix permissi
2fbb0 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  ons.** to create
2fbc0 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e   new files with.
2fbd0 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
2fbe0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2fbf0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
2fc00 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73  ** and a value s
2fc10 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73  uitable for pass
2fc20 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64  ing as the third
2fc30 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65   argument to ope
2fc40 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74  n(2) is.** writt
2fc50 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66  en to *pMode. If
2fc60 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2fc70 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
2fc80 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
2fc90 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2fca0 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64  e value of *pMod
2fcb0 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65  e is not modifie
2fcc0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74  d..**.** In most
2fcd0 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75   cases, this rou
2fce0 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65  tine sets *pMode
2fcf0 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c   to 0, which wil
2fd00 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69  l become.** an i
2fd10 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62  ndication to rob
2fd20 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72  ust_open() to cr
2fd30 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73  eate the file us
2fd40 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45  ing.** SQLITE_DE
2fd50 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2fd60 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20  SSIONS adjusted 
2fd70 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  by the umask..**
2fd80 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65   But if the file
2fd90 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
2fda0 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61   a WAL or regula
2fdb0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
2fdc0 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  then .** this fu
2fdd0 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74  nction queries t
2fde0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
2fdf0 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  or the permissio
2fe00 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f  ns on the .** co
2fe10 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
2fe20 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65  base file and se
2fe30 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69  ts *pMode to thi
2fe40 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65  s value. Wheneve
2fe50 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20  r .** possible, 
2fe60 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  WAL and journal 
2fe70 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
2fe80 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
2fe90 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
2fea0 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   as the associat
2feb0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
2fec0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
2fed0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
2fee0 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73  _NAMES option is
2fef0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
2ff00 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66  he.** original f
2ff10 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61  ilename is unava
2ff20 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33  ilable.  But 8_3
2ff30 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75  _NAMES is only u
2ff40 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66  sed for.** FAT f
2ff50 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70  ilesystems and p
2ff60 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f  ermissions do no
2ff70 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20  t matter there, 
2ff80 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74  so just use.** t
2ff90 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69  he default permi
2ffa0 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssions..*/.stati
2ffb0 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65  c int findCreate
2ffc0 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
2ffd0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2ffe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2fff0 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73  ath of file (pos
30000 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65  sibly) being cre
30010 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ated */.  int fl
30020 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
30030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
30040 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68  gs passed as 4th
30050 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70   argument to xOp
30060 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  en() */.  mode_t
30070 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20   *pMode,        
30080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
30090 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  : Permissions to
300a0 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20   open file with 
300b0 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64  */.  uid_t *pUid
300c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
300d0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64       /* OUT: uid
300e0 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66   to set on the f
300f0 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a  ile */.  gid_t *
30100 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20  pGid            
30110 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
30120 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   gid to set on t
30130 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  he file */.){.  
30140 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30150 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
30160 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
30170 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a  /.  *pMode = 0;.
30180 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a    *pUid = 0;.  *
30190 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  pGid = 0;.  if( 
301a0 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
301b0 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
301c0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
301d0 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  L) ){.    char z
301e0 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  Db[MAX_PATHNAME+
301f0 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  1];     /* Datab
30200 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f  ase file path */
30210 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20  .    int nDb;   
30220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30230 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30240 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a  valid bytes in z
30250 44 62 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50  Db */..    /* zP
30260 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f  ath is a path to
30270 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61   a WAL or journa
30280 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  l file. The foll
30290 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69  owing block deri
302a0 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ves.    ** the p
302b0 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63  ath to the assoc
302c0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
302d0 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20  ile from zPath. 
302e0 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c  This block handl
302f0 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  es.    ** the fo
30300 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63  llowing naming c
30310 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20  onventions:.    
30320 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  **.    **   "<pa
30330 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
30340 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
30350 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20  th to db>-wal". 
30360 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
30370 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22  o db>-journalNN"
30380 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
30390 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20   to db>-walNN". 
303a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65     **.    ** whe
303b0 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d  re NN is a decim
303c0 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e  al number. The N
303d0 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73  N naming schemes
303e0 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65   are .    ** use
303f0 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75  d by the test_mu
30400 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65  ltiplex.c module
30410 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62  ..    */.    nDb
30420 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
30430 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a  30(zPath) - 1; .
30440 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68      while( zPath
30450 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20  [nDb]!='-' ){.  
30460 20 20 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c      /* In normal
30470 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 65 20   operation, the 
30480 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
30490 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 63 6f  e will always co
304a0 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ntain.      ** a
304b0 20 27 2d 27 20 63 68 61 72 61 63 74 65 72 2e 20   '-' character. 
304c0 20 48 6f 77 65 76 65 72 20 69 6e 20 38 2b 33 20   However in 8+3 
304d0 66 69 6c 65 6e 61 6d 65 20 6d 6f 64 65 2c 20 6f  filename mode, o
304e0 72 20 69 66 20 61 20 63 6f 72 72 75 70 74 0a 20  r if a corrupt. 
304f0 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
30500 20 6a 6f 75 72 6e 61 6c 20 73 70 65 63 69 66 69   journal specifi
30510 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
30520 6e 61 6c 20 77 69 74 68 20 61 20 67 6f 6f 66 79  nal with a goofy
30530 20 6e 61 6d 65 2c 20 74 68 65 6e 0a 20 20 20 20   name, then.    
30540 20 20 2a 2a 20 74 68 65 20 27 2d 27 20 6d 69 67    ** the '-' mig
30550 68 74 20 62 65 20 6d 69 73 73 69 6e 67 2e 20 2a  ht be missing. *
30560 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 44 62 3d  /.      if( nDb=
30570 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d  =0 || zPath[nDb]
30580 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 20 53  =='.' ) return S
30590 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
305a0 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  nDb--;.    }.   
305b0 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61   memcpy(zDb, zPa
305c0 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44  th, nDb);.    zD
305d0 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a  b[nDb] = '\0';..
305e0 20 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c 65      rc = getFile
305f0 4d 6f 64 65 28 7a 44 62 2c 20 70 4d 6f 64 65 2c  Mode(zDb, pMode,
30600 20 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20 20   pUid, pGid);.  
30610 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
30620 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
30630 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20  LETEONCLOSE ){. 
30640 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30     *pMode = 0600
30650 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
30660 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
30670 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20 2f 2a 20  N_URI ){.    /* 
30680 49 66 20 74 68 69 73 20 69 73 20 61 20 6d 61 69  If this is a mai
30690 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
306a0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 77 61 73  and the file was
306b0 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 61 20   opened using a 
306c0 55 52 49 0a 20 20 20 20 2a 2a 20 66 69 6c 65 6e  URI.    ** filen
306d0 61 6d 65 2c 20 63 68 65 63 6b 20 66 6f 72 20 74  ame, check for t
306e0 68 65 20 22 6d 6f 64 65 6f 66 22 20 70 61 72 61  he "modeof" para
306f0 6d 65 74 65 72 2e 20 49 66 20 70 72 65 73 65 6e  meter. If presen
30700 74 2c 20 69 6e 74 65 72 70 72 65 74 0a 20 20 20  t, interpret.   
30710 20 2a 2a 20 69 74 73 20 76 61 6c 75 65 20 61 73   ** its value as
30720 20 61 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20   a filename and 
30730 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  try to copy the 
30740 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64 20 67 69  mode, uid and gi
30750 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  d from.    ** th
30760 61 74 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  at file.  */.   
30770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
30780 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
30790 61 6d 65 74 65 72 28 7a 50 61 74 68 2c 20 22 6d  ameter(zPath, "m
307a0 6f 64 65 6f 66 22 29 3b 0a 20 20 20 20 69 66 28  odeof");.    if(
307b0 20 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   z ){.      rc =
307c0 20 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 2c 20   getFileMode(z, 
307d0 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47 69  pMode, pUid, pGi
307e0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  d);.    }.  }.  
307f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30800 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
30810 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
30820 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
30830 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
30840 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
30850 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
30860 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
30870 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
30880 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
30890 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
308a0 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
308b0 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
308c0 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
308d0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
308e0 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
308f0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
30900 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
30910 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
30920 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
30930 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
30940 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
30950 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
30960 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
30970 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
30980 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
30990 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
309a0 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
309b0 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
309c0 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
309d0 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
309e0 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
309f0 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
30a00 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
30a10 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
30a20 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
30a30 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
30a40 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
30a50 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
30a60 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
30a70 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
30a80 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
30a90 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
30aa0 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
30ab0 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
30ac0 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
30ad0 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
30ae0 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
30af0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
30b00 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
30b10 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
30b20 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
30b30 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
30b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
30b50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
30b60 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
30b70 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
30b80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
30b90 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
30ba0 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
30bb0 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
30bc0 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
30bd0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
30be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
30bf0 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
30c00 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
30c10 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
30c20 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
30c30 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
30c40 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
30c50 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
30c60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
30c70 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
30c80 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
30c90 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
30ca0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
30cb0 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
30cc0 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
30cd0 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
30ce0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
30cf0 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
30d00 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  to open() */.  i
30d10 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
30d20 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
30d30 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
30d40 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
30d50 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
30d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30d70 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e  e to omit lockin
30d80 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a  g primitives */.
30d90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30da0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
30db0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
30dc0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
30dd0 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b  t ctrlFlags = 0;
30de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30df0 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73  UNIXFILE_* flags
30e00 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
30e10 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
30e20 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
30e30 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
30e40 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
30e50 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
30e60 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
30e70 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
30e80 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
30e90 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
30ea0 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
30eb0 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
30ec0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
30ed0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
30ee0 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
30ef0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
30f00 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
30f10 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
30f20 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
30f30 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50  LE.  int isAutoP
30f40 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26  roxy  = (flags &
30f50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
30f60 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a  OPROXY);.#endif.
30f70 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
30f80 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
30f90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
30fa0 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73  STYLE.  struct s
30fb0 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65  tatfs fsInfo;.#e
30fc0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72  ndif..  /* If cr
30fd0 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  eating a master 
30fe0 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75  or main-file jou
30ff0 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  rnal, this funct
31000 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20  ion will open.  
31010 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69  ** a file-descri
31020 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65  ptor on the dire
31030 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66  ctory too. The f
31040 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79  irst time unixSy
31050 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c  nc().  ** is cal
31060 6c 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72  led the director
31070 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
31080 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28  r will be fsync(
31090 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64  )ed and close()d
310a0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4e  ..  */.  int isN
310b0 65 77 4a 72 6e 6c 20 3d 20 28 69 73 43 72 65 61  ewJrnl = (isCrea
310c0 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
310d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
310e0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
310f0 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
31100 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
31110 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
31120 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
31130 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
31140 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
31150 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
31160 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
31170 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
31180 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
31190 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
311a0 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
311b0 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
311c0 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
311d0 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
311e0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
311f0 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  E+2];.  const ch
31200 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74  ar *zName = zPat
31210 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  h;..  /* Check t
31220 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
31230 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
31240 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
31250 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
31260 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
31270 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
31280 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
31290 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
312a0 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
312b0 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
312c0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
312d0 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
312e0 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
312f0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
31300 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
31310 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
31320 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
31330 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
31340 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
31350 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
31360 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
31370 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
31380 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
31390 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
313a0 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
313b0 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
313c0 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
313d0 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
313e0 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
313f0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
31400 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
31410 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
31420 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
31430 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
31440 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
31450 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
31460 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
31470 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
31480 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
31490 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
314a0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
314b0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
314c0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
314d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
314e0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
314f0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
31500 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
31510 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
31520 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
31530 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
31540 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
31550 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
31560 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
31570 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
31580 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
31590 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
315a0 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
315b0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
315c0 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
315d0 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
315e0 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
315f0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
31600 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
31610 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
31620 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
31630 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
31640 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
31650 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
31660 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
31670 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
31680 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
31690 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
316a0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
316b0 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
316c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
316d0 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
316e0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
316f0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
31700 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
31710 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
31720 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63    );..  /* Detec
31730 74 20 61 20 70 69 64 20 63 68 61 6e 67 65 20 61  t a pid change a
31740 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 52 4e  nd reset the PRN
31750 47 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 72  G.  There is a r
31760 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20  ace condition.  
31770 2a 2a 20 68 65 72 65 20 73 75 63 68 20 74 68 61  ** here such tha
31780 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68  t two or more th
31790 72 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e 67  reads all trying
317a0 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
317b0 65 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  es at.  ** the s
317c0 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67 68  ame instant migh
317d0 74 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65 20  t all reset the 
317e0 50 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74 69  PRNG.  But multi
317f0 70 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a 20  ple resets.  ** 
31800 61 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20  are harmless..  
31810 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e  */.  if( randomn
31820 65 73 73 50 69 64 21 3d 6f 73 47 65 74 70 69 64  essPid!=osGetpid
31830 28 30 29 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f  (0) ){.    rando
31840 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65 74  mnessPid = osGet
31850 70 69 64 28 30 29 3b 0a 20 20 20 20 73 71 6c 69  pid(0);.    sqli
31860 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30  te3_randomness(0
31870 2c 30 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ,0);.  }.  memse
31880 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  t(p, 0, sizeof(u
31890 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66  nixFile));..  if
318a0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
318b0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a  OPEN_MAIN_DB ){.
318c0 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
318d0 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70   *pUnused;.    p
318e0 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
318f0 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66  sableFd(zName, f
31900 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
31910 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
31920 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
31930 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31940 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
31950 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69  ite3_malloc64(si
31960 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
31970 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75  .      if( !pUnu
31980 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sed ){.        r
31990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
319a0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
319b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50  .    }.    p->pP
319c0 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
319d0 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20  d = pUnused;..  
319e0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
319f0 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62  lenames are doub
31a00 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
31a10 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ed if they are n
31a20 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20 77  ot.    ** URIs w
31a30 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20  ith parameters. 
31a40 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e   Hence, they can
31a50 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73 65   always be passe
31a60 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71  d into.    ** sq
31a70 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
31a80 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73  ter(). */.    as
31a90 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 53  sert( (flags & S
31aa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
31ab0 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  || zName[strlen(
31ac0 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  zName)+1]==0 );.
31ad0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e  .  }else if( !zN
31ae0 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ame ){.    /* If
31af0 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20   zName is NULL, 
31b00 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
31b10 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  is requesting a 
31b20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  temp file. */.  
31b30 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
31b40 65 20 26 26 20 21 69 73 4e 65 77 4a 72 6e 6c 29  e && !isNewJrnl)
31b50 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47  ;.    rc = unixG
31b60 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2d  etTempname(pVfs-
31b70 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 6d  >mxPathname, zTm
31b80 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
31b90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31ba0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
31bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
31bc0 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20  e = zTmpname;.. 
31bd0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20     /* Generated 
31be0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61  temporary filena
31bf0 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 64  mes are always d
31c00 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
31c10 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72  nated.    ** for
31c20 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f   use by sqlite3_
31c30 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
31c40 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
31c50 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61  zName[strlen(zNa
31c60 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d  me)+1]==0 );.  }
31c70 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
31c80 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
31c90 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
31ca0 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49  r passed to POSI
31cb0 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  X function.  ** 
31cc0 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75  open(). These mu
31cd0 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64  st be calculated
31ce0 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20   even if open() 
31cf0 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61  is not called, a
31d00 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20  s.  ** they may 
31d10 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  be stored as par
31d20 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  t of the file ha
31d30 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79  ndle and used by
31d40 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63   the .  ** 'conc
31d50 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20  h file' locking 
31d60 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20  functions later 
31d70 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  on.  */.  if( is
31d80 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
31d90 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
31da0 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
31db0 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
31dc0 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
31dd0 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
31de0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
31df0 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
31e00 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
31e10 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
31e20 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
31e30 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
31e40 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
31e50 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29  );..  if( fd<0 )
31e60 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65  {.    mode_t ope
31e70 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  nMode;          
31e80 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f      /* Permissio
31e90 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c  ns to create fil
31ea0 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69  e with */.    ui
31eb0 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20 20  d_t uid;        
31ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
31ed0 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66 69  serid for the fi
31ee0 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20  le */.    gid_t 
31ef0 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  gid;            
31f00 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70          /* Group
31f10 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  id for the file 
31f20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  */.    rc = find
31f30 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a  CreateFileMode(z
31f40 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70  Name, flags, &op
31f50 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67  enMode, &uid, &g
31f60 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  id);.    if( rc!
31f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31f80 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
31f90 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
31fa0 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  sed );.      ass
31fb0 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
31fc0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65  TE_OPEN_WAL || e
31fd0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
31fe0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
31ff0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
32000 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20  c;.    }.    fd 
32010 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
32020 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
32030 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f  openMode);.    O
32040 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20  STRACE(("OPENX  
32050 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c   %-3d %s 0%o\n",
32060 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e   fd, zName, open
32070 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 61 73 73  Flags));.    ass
32080 65 72 74 28 20 21 69 73 45 78 63 6c 75 73 69 76  ert( !isExclusiv
32090 65 20 7c 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20  e || (openFlags 
320a0 26 20 4f 5f 43 52 45 41 54 29 21 3d 30 20 29 3b  & O_CREAT)!=0 );
320b0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
320c0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4e 65 77  .      if( isNew
320d0 4a 72 6e 6c 20 26 26 20 65 72 72 6e 6f 3d 3d 45  Jrnl && errno==E
320e0 41 43 43 45 53 20 26 26 20 6f 73 41 63 63 65 73  ACCES && osAcces
320f0 73 28 7a 4e 61 6d 65 2c 20 46 5f 4f 4b 29 20 29  s(zName, F_OK) )
32100 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
32110 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65  unable to create
32120 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 63 61 75   a journal becau
32130 73 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  se the directory
32140 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
32150 2a 2a 20 77 72 69 74 61 62 6c 65 2c 20 63 68 61  ** writable, cha
32160 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f  nge the error co
32170 64 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  de to indicate t
32180 68 61 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  hat. */.        
32190 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
321a0 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 3b 0a  ONLY_DIRECTORY;.
321b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
321c0 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
321d0 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
321e0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65          /* Faile
321f0 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  d to open the fi
32200 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  le for read/writ
32210 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72 65  e access. Try re
32220 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  ad-only. */.    
32230 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
32240 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
32250 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
32260 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20  _CREATE);.      
32270 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e    openFlags &= ~
32280 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29  (O_RDWR|O_CREAT)
32290 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
322a0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
322b0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
322c0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
322d0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  RDONLY;.        
322e0 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
322f0 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62          fd = rob
32300 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
32310 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
32320 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
32330 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30    }.    if( fd<0
32340 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
32350 32 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  2 = unixLogError
32360 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
32370 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
32380 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
32390 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
323a0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
323b0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
323c0 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hed;.    }..    
323d0 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65  /* If this proce
323e0 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73  ss is running as
323f0 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65   root and if cre
32400 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c  ating a new roll
32410 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  back.    ** jour
32420 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c  nal or WAL file,
32430 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68   set the ownersh
32440 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ip of the journa
32450 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20  l or WAL to be. 
32460 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61     ** the same a
32470 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
32480 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
32490 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
324a0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
324b0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
324c0 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
324d0 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e      robustFchown
324e0 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a  (fd, uid, gid);.
324f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
32500 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
32510 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
32520 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
32530 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
32540 66 28 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  f( p->pPrealloca
32550 74 65 64 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  tedUnused ){.   
32560 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65   p->pPreallocate
32570 64 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  dUnused->fd = fd
32580 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c  ;.    p->pPreall
32590 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e 66 6c  ocatedUnused->fl
325a0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
325b0 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  ..  if( isDelete
325c0 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
325d0 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a  KS.    zPath = z
325e0 4e 61 6d 65 3b 0a 23 65 6c 69 66 20 64 65 66 69  Name;.#elif defi
325f0 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 4c 49 4e  ned(SQLITE_UNLIN
32600 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 29 0a 20  K_AFTER_CLOSE). 
32610 20 20 20 7a 50 61 74 68 20 3d 20 73 71 6c 69 74     zPath = sqlit
32620 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
32630 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
32640 20 7a 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20   zPath==0 ){.   
32650 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
32660 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p, fd, __LINE__)
32670 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
32680 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
32690 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
326a0 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65    osUnlink(zName
326b0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
326c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
326d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
326e0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65  else{.    p->ope
326f0 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
32700 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  gs;.  }.#endif. 
32710 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f   .#if defined(__
32720 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
32730 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
32740 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73  G_STYLE.  if( fs
32750 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66  tatfs(fd, &fsInf
32760 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
32770 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
32780 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f  , errno);.    ro
32790 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
327a0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
327b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
327c0 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d  OERR_ACCESS;.  }
327d0 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
327e0 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49  cmp("msdos", fsI
327f0 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
32800 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
32810 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
32820 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
32830 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
32840 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  OS;.  }.  if (0 
32850 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61  == strncmp("exfa
32860 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  t", fsInfo.f_fst
32870 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
32880 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
32890 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
328a0 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
328b0 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23  _IS_MSDOS;.  }.#
328c0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
328d0 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  up appropriate c
328e0 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66  trlFlags */.  if
328f0 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20  ( isDelete )    
32900 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
32910 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
32920 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20  E_DELETE;.  if( 
32930 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20  isReadonly )    
32940 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
32950 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
32960 52 44 4f 4e 4c 59 3b 0a 20 20 6e 6f 4c 6f 63 6b  RDONLY;.  noLock
32970 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45   = eType!=SQLITE
32980 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 20  _OPEN_MAIN_DB;. 
32990 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20   if( noLock )   
329a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
329b0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
329c0 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69  FILE_NOLOCK;.  i
329d0 66 28 20 69 73 4e 65 77 4a 72 6e 6c 20 29 20 20  f( isNewJrnl )  
329e0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
329f0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
32a00 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66  LE_DIRSYNC;.  if
32a10 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
32a20 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c  _OPEN_URI ) ctrl
32a30 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
32a40 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49  E_URI;..#if SQLI
32a50 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
32a60 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49  G_STYLE.#if SQLI
32a70 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
32a80 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f  LOCKING.  isAuto
32a90 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69  Proxy = 1;.#endi
32aa0 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72  f.  if( isAutoPr
32ab0 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e  oxy && (zPath!=N
32ac0 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b  ULL) && (!noLock
32ad0 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  ) && pVfs->xOpen
32ae0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e   ){.    char *en
32af0 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28  vforce = getenv(
32b00 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  "SQLITE_FORCE_PR
32b10 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20  OXY_LOCKING");. 
32b20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20     int useProxy 
32b30 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c  = 0;..    /* SQL
32b40 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
32b50 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73  LOCKING==1 means
32b60 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73   force always us
32b70 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73  e proxy, 0 means
32b80 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75   .    ** never u
32b90 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d  se proxy, NULL m
32ba0 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66  eans use proxy f
32bb0 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  or non-local fil
32bc0 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  es only.  */.   
32bd0 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e   if( envforce!=N
32be0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ULL ){.      use
32bf0 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76  Proxy = atoi(env
32c00 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65  force)>0;.    }e
32c10 6c 73 65 7b 0a 20 20 20 20 20 20 75 73 65 50 72  lse{.      usePr
32c20 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66  oxy = !(fsInfo.f
32c30 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c  _flags&MNT_LOCAL
32c40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
32c50 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20   useProxy ){.   
32c60 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e     rc = fillInUn
32c70 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
32c80 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
32c90 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  trlFlags);.     
32ca0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32cb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
32cc0 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
32cd0 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
32ce0 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
32cf0 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
32d00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32d10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
32d20 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
32d30 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
32d40 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
32d50 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
32d60 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
32d70 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
32d80 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
32d90 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
32da0 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
32db0 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
32dc0 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
32dd0 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
32de0 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
32df0 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
32e00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
32e10 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
32e20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
32e30 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
32e40 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
32e50 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
32e60 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
32e70 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 7a 50  .  .  assert( zP
32e80 61 74 68 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b  ath==0 || zPath[
32e90 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 20 20 7c  0]=='/' .      |
32ea0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
32eb0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
32ec0 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
32ed0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
32ee0 4f 55 52 4e 41 4c 20 0a 20 20 29 3b 0a 20 20 72  OURNAL .  );.  r
32ef0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
32f00 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69  le(pVfs, fd, pFi
32f10 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46  le, zPath, ctrlF
32f20 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e  lags);..open_fin
32f30 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ished:.  if( rc!
32f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32f50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
32f60 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55  ->pPreallocatedU
32f70 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65  nused);.  }.  re
32f80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
32f90 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
32fa0 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20  le at zPath. If 
32fb0 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75  the dirSync argu
32fc0 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73  ment is true, fs
32fd0 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72  ync().** the dir
32fe0 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
32ff0 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a  eting the file..
33000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
33010 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  ixDelete(.  sqli
33020 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33030 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e  ,     /* VFS con
33040 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20  taining this as 
33050 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68  the xDelete meth
33060 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
33070 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
33080 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
33090 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
330a0 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63  */.  int dirSync
330b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
330c0 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63  * If true, fsync
330d0 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  () directory aft
330e0 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65  er deleting file
330f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
33100 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55  = SQLITE_OK;.  U
33110 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
33120 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
33130 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
33140 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
33150 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f  DELETE);.  if( o
33160 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d  sUnlink(zPath)==
33170 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20  (-1) ){.    if( 
33180 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69  errno==ENOENT.#i
33190 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
331a0 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73 73       || osAccess
331b0 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e  (zPath,0)!=0.#en
331c0 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
331d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
331e0 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
331f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33200 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
33210 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
33220 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b  _DELETE, "unlink
33230 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
33240 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
33250 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
33260 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
33270 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e  NC.  if( (dirSyn
33280 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20  c & 1)!=0 ){.   
33290 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
332a0 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
332b0 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
332c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
332d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
332e0 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 66 64 2c  ( full_fsync(fd,
332f0 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  0,0) ){.        
33300 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
33310 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
33320 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63  IR_FSYNC, "fsync
33330 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  ", zPath);.     
33340 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f   }.      robust_
33350 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
33360 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
33370 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
33380 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
33390 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63  OPEN );.      rc
333a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
333b0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
333c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
333d0 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78  *.** Test the ex
333e0 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63  istence of or ac
333f0 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
33400 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20   of file zPath. 
33410 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66  The.** test perf
33420 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  ormed depends on
33430 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c   the value of fl
33440 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ags:.**.**     S
33450 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
33460 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66  STS: Return 1 if
33470 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
33480 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
33490 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
334a0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
334b0 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e   file is read an
334c0 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20  d writable..**  
334d0 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
334e0 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72  _READONLY: Retur
334f0 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
33500 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a  is readable..**.
33510 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  ** Otherwise ret
33520 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
33530 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28   int unixAccess(
33540 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
33550 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68  NotUsed,   /* Th
33560 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67  e VFS containing
33570 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d 65   this xAccess me
33580 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
33590 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
335a0 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65    /* Path of the
335b0 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65   file to examine
335c0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
335d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
335e0 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74   What do we want
335f0 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20   to learn about 
33600 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20  the zPath file? 
33610 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
33620 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
33630 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f  Write result boo
33640 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  lean here */.){.
33650 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
33660 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
33670 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
33680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
33690 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
336a0 20 61 73 73 65 72 74 28 20 70 52 65 73 4f 75 74   assert( pResOut
336b0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  !=0 );..  /* The
336c0 20 73 70 65 63 20 73 61 79 73 20 74 68 65 72 65   spec says there
336d0 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73 69   are three possi
336e0 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20 66  ble values for f
336f0 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79 0a  lags.  But only.
33700 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65 6d    ** two of them
33710 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73   are actually us
33720 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
33730 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
33740 43 45 53 53 5f 45 58 49 53 54 53 20 7c 7c 20 66  CESS_EXISTS || f
33750 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
33760 45 53 53 5f 52 45 41 44 57 52 49 54 45 20 29 3b  ESS_READWRITE );
33770 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53  ..  if( flags==S
33780 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
33790 53 54 53 20 29 7b 0a 20 20 20 20 73 74 72 75 63  STS ){.    struc
337a0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
337b0 2a 70 52 65 73 4f 75 74 20 3d 20 28 30 3d 3d 6f  *pResOut = (0==o
337c0 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75  sStat(zPath, &bu
337d0 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a  f) && buf.st_siz
337e0 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e>0);.  }else{. 
337f0 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 6f 73     *pResOut = os
33800 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 57 5f  Access(zPath, W_
33810 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20 7d  OK|R_OK)==0;.  }
33820 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
33830 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  _OK;.}../*.**.*/
33840 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6b 46 75  .static int mkFu
33850 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f  llPathname(.  co
33860 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
33870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33880 20 49 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   Input path */. 
33890 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20 20   char *zOut,    
338a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338b0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
338c0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 20  r */.  int nOut 
338d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338e0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
338f0 74 65 64 20 73 69 7a 65 20 6f 66 20 62 75 66 66  ted size of buff
33900 65 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b 0a 20 20  er zOut */.){.  
33910 69 6e 74 20 6e 50 61 74 68 20 3d 20 73 71 6c 69  int nPath = sqli
33920 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
33930 68 29 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  h);.  int iOff =
33940 20 30 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b   0;.  if( zPath[
33950 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 69  0]!='/' ){.    i
33960 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
33970 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30 20 29 7b 0a  , nOut-2)==0 ){.
33980 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
33990 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
339a0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
339b0 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
339c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66  ;.    }.    iOff
339d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
339e0 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7a 4f  30(zOut);.    zO
339f0 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20 27 2f 27  ut[iOff++] = '/'
33a00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 4f 66  ;.  }.  if( (iOf
33a10 66 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f 75 74 20  f+nPath+1)>nOut 
33a20 29 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 69 74 65  ){.    /* SQLite
33a30 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 78 46   assumes that xF
33a40 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 6e 75  ullPathname() nu
33a50 6c 2d 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65  l-terminates the
33a60 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 0a 20   output buffer. 
33a70 20 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 69 74     ** even if it
33a80 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
33a90 72 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f 75 74 5b  r.  */.    zOut[
33aa0 69 4f 66 66 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  iOff] = '\0';.  
33ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33ac0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
33ad0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
33ae0 72 69 6e 74 66 28 6e 4f 75 74 2d 69 4f 66 66 2c  rintf(nOut-iOff,
33af0 20 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c 20 22 25   &zOut[iOff], "%
33b00 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 72 65  s", zPath);.  re
33b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33b20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
33b30 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
33b40 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
33b50 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
33b60 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
33b70 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
33b80 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
33b90 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
33ba0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
33bb0 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
33bc0 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
33bd0 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
33be0 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
33bf0 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
33c00 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
33c10 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
33c20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
33c30 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
33c40 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
33c50 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
33c60 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
33c70 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
33c80 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
33c90 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
33ca0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
33cb0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
33cc0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
33cd0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
33ce0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
33cf0 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
33d00 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
33d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
33d30 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
33d40 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
33d50 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
33d60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
33d70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
33d80 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56  #if !defined(HAV
33d90 45 5f 52 45 41 44 4c 49 4e 4b 29 20 7c 7c 20 21  E_READLINK) || !
33da0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 53 54  defined(HAVE_LST
33db0 41 54 29 0a 20 20 72 65 74 75 72 6e 20 6d 6b 46  AT).  return mkF
33dc0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 50 61 74  ullPathname(zPat
33dd0 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a  h, zOut, nOut);.
33de0 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 20 3d  #else.  int rc =
33df0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
33e00 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 6e  t nByte;.  int n
33e10 4c 69 6e 6b 20 3d 20 31 3b 20 20 20 20 20 20 20  Link = 1;       
33e20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
33e30 65 72 20 6f 66 20 73 79 6d 62 6f 6c 69 63 20 6c  er of symbolic l
33e40 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64 20 73 6f  inks followed so
33e50 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   far */.  const 
33e60 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 50 61 74  char *zIn = zPat
33e70 68 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74  h;      /* Input
33e80 20 70 61 74 68 20 66 6f 72 20 65 61 63 68 20 69   path for each i
33e90 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70  teration of loop
33ea0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c   */.  char *zDel
33eb0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
33ec0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
33ed0 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e==MAX_PATHNAME 
33ee0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
33ef0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
33f00 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
33f10 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
33f20 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
33f30 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
33f40 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
33f50 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
33f60 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
33f70 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
33f80 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
33f90 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
33fa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
33fb0 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
33fc0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
33fd0 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
33fe0 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
33ff0 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
34000 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
34010 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
34020 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
34030 0a 20 20 64 6f 20 7b 0a 0a 20 20 20 20 2f 2a 20  .  do {..    /* 
34040 43 61 6c 6c 20 73 74 61 74 28 29 20 6f 6e 20 70  Call stat() on p
34050 61 74 68 20 7a 49 6e 2e 20 53 65 74 20 62 4c 69  ath zIn. Set bLi
34060 6e 6b 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  nk to true if th
34070 65 20 70 61 74 68 20 69 73 20 61 20 73 79 6d 62  e path is a symb
34080 6f 6c 69 63 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b  olic.    ** link
34090 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
340a0 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 6e  wise.  */.    in
340b0 74 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a 20 20 20  t bLink = 0;.   
340c0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
340d0 3b 0a 20 20 20 20 69 66 28 20 6f 73 4c 73 74 61  ;.    if( osLsta
340e0 74 28 7a 49 6e 2c 20 26 62 75 66 29 21 3d 30 20  t(zIn, &buf)!=0 
340f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
34100 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no!=ENOENT ){.  
34110 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
34120 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
34130 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6c  ANTOPEN_BKPT, "l
34140 73 74 61 74 22 2c 20 7a 49 6e 29 3b 0a 20 20 20  stat", zIn);.   
34150 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
34160 20 20 20 20 20 20 62 4c 69 6e 6b 20 3d 20 53 5f        bLink = S_
34170 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f 64  ISLNK(buf.st_mod
34180 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
34190 66 28 20 62 4c 69 6e 6b 20 29 7b 0a 20 20 20 20  f( bLink ){.    
341a0 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29 7b    if( zDel==0 ){
341b0 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 20 3d 20  .        zDel = 
341c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
341d0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Out);.        if
341e0 28 20 7a 44 65 6c 3d 3d 30 20 29 20 72 63 20 3d  ( zDel==0 ) rc =
341f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
34200 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  PT;.      }else 
34210 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53 51 4c 49  if( ++nLink>SQLI
34220 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20  TE_MAX_SYMLINKS 
34230 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
34240 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
34250 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  BKPT;.      }.. 
34260 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34280 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65 61 64    nByte = osRead
34290 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65 6c 2c 20  link(zIn, zDel, 
342a0 6e 4f 75 74 2d 31 29 3b 0a 20 20 20 20 20 20 20  nOut-1);.       
342b0 20 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a   if( nByte<0 ){.
342c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
342d0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
342e0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
342f0 2c 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a 49  , "readlink", zI
34300 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
34310 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
34320 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27 20 29 7b   zDel[0]!='/' ){
34330 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
34340 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
34350 66 6f 72 28 6e 20 3d 20 73 71 6c 69 74 65 33 53  for(n = sqlite3S
34360 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3b 20 6e 3e  trlen30(zIn); n>
34370 30 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d 21 3d 27  0 && zIn[n-1]!='
34380 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20 20 20 20  /'; n--);.      
34390 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 2b        if( nByte+
343a0 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  n+1>nOut ){.    
343b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
343c0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
343d0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
343e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
343f0 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a        memmove(&z
34400 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c 20 6e 42  Del[n], zDel, nB
34410 79 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  yte+1);.        
34420 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 65        memcpy(zDe
34430 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20 20 20 20  l, zIn, n);.    
34440 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
34450 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  += n;.          
34460 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
34470 20 20 20 20 20 20 20 20 20 20 7a 44 65 6c 5b 6e            zDel[n
34480 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  Byte] = '\0';.  
34490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
344a0 0a 20 20 20 20 20 20 7a 49 6e 20 3d 20 7a 44 65  .      zIn = zDe
344b0 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  l;.    }..    as
344c0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
344d0 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a 4f 75 74  _OK || zIn!=zOut
344e0 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27 2f 27 20   || zIn[0]=='/' 
344f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
34500 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 49 6e 21  QLITE_OK && zIn!
34510 3d 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  =zOut ){.      r
34520 63 20 3d 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61  c = mkFullPathna
34530 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c 20 6e 4f  me(zIn, zOut, nO
34540 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ut);.    }.    i
34550 66 28 20 62 4c 69 6e 6b 3d 3d 30 20 29 20 62 72  f( bLink==0 ) br
34560 65 61 6b 3b 0a 20 20 20 20 7a 49 6e 20 3d 20 7a  eak;.    zIn = z
34570 4f 75 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  Out;.  }while( r
34580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
34590 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
345a0 7a 44 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  zDel);.  return 
345b0 72 63 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20  rc;.#endif   /* 
345c0 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 20 26 26  HAVE_READLINK &&
345d0 20 48 41 56 45 5f 4c 53 54 41 54 20 2a 2f 0a 7d   HAVE_LSTAT */.}
345e0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
345f0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
34600 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
34610 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
34620 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
34630 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
34640 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
34650 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
34660 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
34670 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
34680 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c  ibrary..*/.#incl
34690 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74  ude <dlfcn.h>.st
346a0 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
346b0 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
346c0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73  s *NotUsed, cons
346d0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
346e0 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
346f0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
34700 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e  .  return dlopen
34710 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44  (zFilename, RTLD
34720 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42  _NOW | RTLD_GLOB
34730 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  AL);.}../*.** SQ
34740 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
34750 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61  function immedia
34760 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c  tely after a cal
34770 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29  l to unixDlSym()
34780 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65   or.** unixDlOpe
34790 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72  n() fails (retur
347a0 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  ns a null pointe
347b0 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65  r). If a more de
347c0 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20  tailed error.** 
347d0 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c  message is avail
347e0 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74  able, it is writ
347f0 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20  ten to zBufOut. 
34800 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73  If no error mess
34810 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  age.** is availa
34820 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20  ble, zBufOut is 
34830 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20  left unmodified 
34840 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20  and SQLite uses 
34850 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72  a default.** err
34860 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73  or message..*/.s
34870 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
34880 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
34890 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
348a0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
348b0 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  fOut){.  const c
348c0 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
348d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
348e0 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e  tUsed);.  unixEn
348f0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45  terMutex();.  zE
34900 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a  rr = dlerror();.
34910 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
34920 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
34930 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
34940 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
34950 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
34960 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
34970 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d  void (*unixDlSym
34980 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
34990 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20  tUsed, void *p, 
349a0 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29  const char*zSym)
349b0 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20  )(void){.  /* . 
349c0 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65   ** GCC with -pe
349d0 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61  dantic-errors sa
349e0 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73  ys that C90 does
349f0 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69   not allow a voi
34a00 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61  d* to be.  ** ca
34a10 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  st into a pointe
34a20 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
34a30 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69    And yet the li
34a40 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f  brary dlsym() ro
34a50 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72  utine.  ** retur
34a60 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68  ns a void* which
34a70 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
34a80 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
34a90 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77  on.  So how do w
34aa0 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d  e.  ** use dlsym
34ab0 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  () with -pedanti
34ac0 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20  c-errors?.  **. 
34ad0 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62   ** Variable x b
34ae0 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20  elow is defined 
34af0 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  to be a pointer 
34b00 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61  to a function ta
34b10 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65  king.  ** parame
34b20 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63  ters void* and c
34b30 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72  onst char* and r
34b40 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74  eturning a point
34b50 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
34b60 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61  ..  ** We initia
34b70 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e  lize x by assign
34b80 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72  ing it a pointer
34b90 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20   to the dlsym() 
34ba0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28  function..  ** (
34bb0 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  That assignment 
34bc0 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e  requires a cast.
34bd0 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20  )  Then we call 
34be0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
34bf0 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20  t.  ** x points 
34c00 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  to.  .  **.  ** 
34c10 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  This work-around
34c20 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20   is unlikely to 
34c30 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
34c40 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65  n any system whe
34c50 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c  re.  ** you real
34c60 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61  ly cannot cast a
34c70 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
34c80 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42  r into void*.  B
34c90 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a  ut then, on the.
34ca0 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c    ** other hand,
34cb0 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f   dlsym() will no
34cc0 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61  t work on such a
34cd0 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20   system either, 
34ce0 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  so we have.  ** 
34cf0 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20  not really lost 
34d00 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  anything..  */. 
34d10 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69   void (*(*x)(voi
34d20 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
34d30 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  (void);.  UNUSED
34d40 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
34d50 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64  ed);.  x = (void
34d60 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  (*(*)(void*,cons
34d70 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29  t char*))(void))
34d80 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20  dlsym;.  return 
34d90 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d  (*x)(p, zSym);.}
34da0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
34db0 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
34dc0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
34dd0 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
34de0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
34df0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c  R(NotUsed);.  dl
34e00 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
34e10 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
34e20 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
34e30 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
34e40 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
34e50 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
34e60 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
34e70 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
34e80 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
34e90 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
34ea0 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
34eb0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
34ec0 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
34ed0 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
34ee0 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
34ef0 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
34f00 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
34f10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
34f20 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
34f30 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
34f40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34f50 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65  NotUsed);.  asse
34f60 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e  rt((size_t)nBuf>
34f70 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  =(sizeof(time_t)
34f80 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a  +sizeof(int)));.
34f90 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
34fa0 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
34fb0 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
34fc0 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
34fd0 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
34fe0 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
34ff0 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
35000 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
35010 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
35020 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
35030 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
35040 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
35050 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
35060 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
35070 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
35080 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
35090 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
350a0 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
350b0 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
350c0 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
350d0 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
350e0 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
350f0 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
35100 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
35110 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
35120 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
35130 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
35140 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
35150 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
35160 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
35170 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
35180 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
35190 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
351a0 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
351b0 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
351c0 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
351d0 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b  uence.  This mak
351e0 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
351f0 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
35200 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
35210 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 61  , 0, nBuf);.  ra
35220 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73  ndomnessPid = os
35230 47 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69 66  Getpid(0);  .#if
35240 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
35250 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e  _TEST) && !defin
35260 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
35270 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a 20  ANDOMNESS).  {. 
35280 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a     int fd, got;.
35290 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
352a0 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
352b0 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30  om", O_RDONLY, 0
352c0 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
352d0 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20  ){.      time_t 
352e0 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74  t;.      time(&t
352f0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
35300 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66  zBuf, &t, sizeof
35310 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (t));.      memc
35320 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
35330 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73  t)], &randomness
35340 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64  Pid, sizeof(rand
35350 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20 20  omnessPid));.   
35360 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
35370 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64  f(t)+sizeof(rand
35380 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69 7a  omnessPid)<=(siz
35390 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  e_t)nBuf );.    
353a0 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28    nBuf = sizeof(
353b0 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64  t) + sizeof(rand
353c0 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20 20  omnessPid);.    
353d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b  }else{.      do{
353e0 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64   got = osRead(fd
353f0 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d  , zBuf, nBuf); }
35400 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
35410 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
35420 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
35430 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
35440 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  __);.    }.  }.#
35450 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
35460 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  Buf;.}.../*.** S
35470 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
35480 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
35490 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
354a0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
354b0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
354c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
354d0 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  oseconds we want
354e0 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68   to sleep..** Th
354f0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
35500 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
35510 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20  microseconds of 
35520 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a  sleep actually.*
35530 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
35540 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
35550 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
35560 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68  , a number which
35570 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65  .** might be gre
35580 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
35590 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  al to the argume
355a0 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73  nt, but not less
355b0 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67  .** than the arg
355c0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
355d0 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73   int unixSleep(s
355e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
355f0 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  sed, int microse
35600 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56  conds){.#if OS_V
35610 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
35620 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20  timespec sp;..  
35630 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72  sp.tv_sec = micr
35640 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30  oseconds / 10000
35650 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63  00;.  sp.tv_nsec
35660 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
35670 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30   % 1000000) * 10
35680 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28  00;.  nanosleep(
35690 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e  &sp, NULL);.  UN
356a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
356b0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
356c0 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
356d0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
356e0 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
356f0 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65  VE_USLEEP.  usle
35700 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  ep(microseconds)
35710 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
35720 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
35730 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
35740 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  onds;.#else.  in
35750 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63  t seconds = (mic
35760 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39  roseconds+999999
35770 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65  )/1000000;.  sle
35780 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  ep(seconds);.  U
35790 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
357a0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
357b0 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
357c0 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
357d0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
357e0 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
357f0 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
35800 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
35810 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
35820 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
35830 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
35840 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
35850 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
35860 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
35870 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
35880 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
35890 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
358a0 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
358b0 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
358c0 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
358d0 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
358e0 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
358f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
35900 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
35910 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
35920 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
35930 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
35940 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
35950 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
35960 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
35970 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
35980 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
35990 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
359a0 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
359b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
359c0 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
359d0 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
359e0 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
359f0 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
35a00 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
35a10 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
35a20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
35a30 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
35a40 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
35a50 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
35a60 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
35a70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
35a80 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
35a90 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
35aa0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
35ab0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
35ac0 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
35ad0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
35ae0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
35af0 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
35b00 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
35b10 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
35b20 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
35b30 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
35b40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
35b50 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  ITE_OK;.#if defi
35b60 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
35b70 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
35b80 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
35b90 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
35ba0 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)t)*1000 + unix
35bb0 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
35bc0 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
35bd0 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
35be0 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
35bf0 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
35c00 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
35c10 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
35c20 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
35c30 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
35c40 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
35c50 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
35c60 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
35c70 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67 65 74 74  ow;.  (void)gett
35c80 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20  imeofday(&sNow, 
35c90 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 66  0);  /* Cannot f
35ca0 61 69 6c 20 67 69 76 65 6e 20 76 61 6c 69 64 20  ail given valid 
35cb0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 2a  arguments */.  *
35cc0 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
35cd0 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
35ce0 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
35cf0 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  sec + sNow.tv_us
35d00 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a  ec/1000;.#endif.
35d10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
35d20 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
35d30 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
35d40 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
35d50 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
35d60 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
35d70 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
35d80 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
35d90 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
35da0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
35db0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
35dc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35dd0 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
35de0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
35df0 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
35e00 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
35e10 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
35e20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
35e30 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
35e40 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
35e50 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
35e60 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
35e70 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
35e80 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
35e90 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
35ea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
35eb0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73  nixCurrentTime(s
35ec0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
35ed0 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  sed, double *prN
35ee0 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ow){.  sqlite3_i
35ef0 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e  nt64 i = 0;.  in
35f00 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t rc;.  UNUSED_P
35f10 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
35f20 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75  );.  rc = unixCu
35f30 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30  rrentTimeInt64(0
35f40 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  , &i);.  *prNow 
35f50 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
35f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
35f70 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e  else.# define un
35f80 69 78 43 75 72 72 65 6e 74 54 69 6d 65 20 30 0a  ixCurrentTime 0.
35f90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
35fa0 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  e xGetLastError(
35fb0 29 20 6d 65 74 68 6f 64 20 69 73 20 64 65 73 69  ) method is desi
35fc0 67 6e 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61  gned to return a
35fd0 20 62 65 74 74 65 72 0a 2a 2a 20 6c 6f 77 2d 6c   better.** low-l
35fe0 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61  evel error messa
35ff0 67 65 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e  ge when operatin
36000 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d  g-system problem
36010 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72  s come up.** dur
36020 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61  ing SQLite opera
36030 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74 68 65 20  tion.  Only the 
36040 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63  integer return c
36050 6f 64 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ode is currently
36060 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61  .** used..*/.sta
36070 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c  tic int unixGetL
36080 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
36090 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
360a0 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61  nt NotUsed2, cha
360b0 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20  r *NotUsed3){.  
360c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
360d0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55  (NotUsed);.  UNU
360e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
360f0 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45  tUsed2);.  UNUSE
36100 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
36110 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed3);.  return 
36120 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  errno;.}.../*.**
36130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36140 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71  ****** End of sq
36150 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
36160 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
36170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
36180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
361a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
361b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
361c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
361d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
361e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
361f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
36220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36230 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
36240 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  Proxy Locking **
36250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
36270 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
36280 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f  ng is a "uber-lo
36290 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e  cking-method" in
362a0 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74   this sense:  It
362b0 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68   uses the.** oth
362c0 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  er locking metho
362d0 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20  ds on secondary 
362e0 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f  lock files.  Pro
362f0 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a  xy locking is a.
36300 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76  ** meta-layer ov
36310 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72  er top of the pr
36320 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
36330 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76  implemented abov
36340 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20  e.  For.** this 
36350 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
36360 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
36370 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f  ents of proxy lo
36380 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65  cking is deferre
36390 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20  d.** until late 
363a0 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72  in the file (her
363b0 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20  e) after all of 
363c0 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65  the other I/O me
363d0 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65  thods have.** be
363e0 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20  en defined - so 
363f0 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69  that the primiti
36400 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ve locking metho
36410 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ds are available
36420 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20  .** as services 
36430 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65  to help with the
36440 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
36450 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
36460 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  ..**.****.**.** 
36470 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  The default lock
36480 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53  ing schemes in S
36490 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72  QLite use byte-r
364a0 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ange locks on th
364b0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
364c0 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  le to coordinate
364d0 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e   safe, concurren
364e0 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  t access by mult
364f0 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  iple readers.** 
36500 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74  and writers [htt
36510 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c  p://sqlite.org/l
36520 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20  ockingv3.html]. 
36530 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c   The five file l
36540 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  ocking.** states
36550 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44   (UNLOCKED, PEND
36560 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53  ING, SHARED, RES
36570 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45  ERVED, EXCLUSIVE
36580 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
36590 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65  d.** as POSIX re
365a0 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73  ad & write locks
365b0 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20   over fixed set 
365c0 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69  of locations (vi
365d0 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20  a fsctl),.** on 
365e0 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79  AFP and SMB only
365f0 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d   exclusive byte-
36600 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
36610 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73  available via fs
36620 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57  ctl.** with _IOW
36630 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
36640 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
36650 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65  B2) to track the
36660 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a   same 5 states..
36670 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61  ** To simulate a
36680 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20   F_RDLCK on the 
36690 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e  shared range, on
366a0 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20   AFP a randomly 
366b0 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72  selected.** addr
366c0 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65  ess in the share
366d0 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
366e0 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f   for a SHARED lo
366f0 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a  ck, the entire.*
36700 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  * shared range i
36710 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45  s taken for an E
36720 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a  XCLUSIVE lock):.
36730 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49  **.**      PENDI
36740 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30  NG_BYTE        0
36750 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20  x40000000.**    
36760 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
36770 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
36780 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
36790 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
367a0 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
367b0 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
367c0 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
367d0 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
367e0 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
367f0 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
36800 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
36810 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
36820 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
36830 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
36840 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
36850 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
36860 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
36870 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
36880 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
36890 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
368a0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
368b0 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
368c0 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
368d0 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
368e0 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
368f0 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
36900 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
36910 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
36920 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
36930 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
36940 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
36950 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
36960 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
36970 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
36980 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
36990 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
369a0 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
369b0 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
369c0 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
369d0 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
369e0 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
369f0 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
36a00 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
36a10 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
36a20 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
36a30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
36a40 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
36a50 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
36a60 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
36a70 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
36a80 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
36a90 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
36aa0 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
36ab0 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
36ac0 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
36ad0 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
36ae0 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
36af0 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
36b00 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
36b10 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
36b20 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
36b30 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
36b40 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
36b50 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
36b60 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
36b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
36b80 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
36b90 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
36ba0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
36bb0 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  me, SQLITE_FCNTL
36bc0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
36bd0 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  LE,.**          
36be0 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72               <pr
36bf0 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75  oxy_path> | ":au
36c00 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74  to:");.**  sqlit
36c10 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
36c20 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
36c30 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43  TE_FCNTL_GET_LOC
36c40 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
36c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c60 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61 74       &<proxy_pat
36c70 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51  h>);.**.**.** SQ
36c80 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20  L pragmas.**.** 
36c90 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
36ca0 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
36cb0 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20  le=<proxy_path> 
36cc0 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41  | :auto:.**  PRA
36cd0 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
36ce0 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a  ock_proxy_file.*
36cf0 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20  *.** Specifying 
36d00 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74  ":auto:" means t
36d10 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
36d20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74  a conch file wit
36d30 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  h a matching.** 
36d40 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74  host ID in it, t
36d50 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e  he proxy path in
36d60 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
36d70 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74  will be used, ot
36d80 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f  herwise.** a pro
36d90 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  xy path based on
36da0 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70   the user's temp
36db0 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e   dir.** (via con
36dc0 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
36dd0 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e  USER_TEMP_DIR,..
36de0 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .)) will be used
36df0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75   and the.** actu
36e00 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61  al proxy file na
36e10 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  me is generated 
36e20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e  from the name an
36e30 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a  d path of the.**
36e40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
36e50 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
36e60 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61  .**       For da
36e70 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73  tabase path "/Us
36e80 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a  ers/me/foo.db" .
36e90 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63  **       The loc
36ea0 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22  k path will be "
36eb0 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70  <tmpdir>/sqlitep
36ec0 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f  locks/_Users_me_
36ed0 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a  foo.db:auto:").*
36ee0 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b  *.** Once a lock
36ef0 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67   proxy is config
36f00 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62  ured for a datab
36f10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
36f20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65  it can not.** be
36f30 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65   removed, howeve
36f40 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74  r it may be swit
36f50 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
36f60 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76  ent proxy path v
36f70 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20  ia.** the above 
36f80 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74  APIs (assuming t
36f90 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
36fa0 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20   not being held 
36fb0 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f  by another.** co
36fc0 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63  nnection or proc
36fd0 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ess). .**.**.** 
36fe0 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  How proxy lockin
36ff0 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  g works.** -----
37000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37010 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66  --.**.** Proxy f
37020 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69  ile locking reli
37030 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20  es primarily on 
37040 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69  two new supporti
37050 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a  ng files: .**.**
37060 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65     *  conch file
37070 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73   to limit access
37080 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
37090 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c   file to a singl
370a0 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61  e host.**      a
370b0 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20  t a time.**.**  
370c0 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74   *  proxy file t
370d0 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79  o act as a proxy
370e0 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72   for the advisor
370f0 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79  y locks normally
37100 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f  .**      taken o
37110 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
37120 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  *.** The conch f
37130 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70  ile - to use a p
37140 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74  roxy file, sqlit
37150 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f  e must first "ho
37160 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a  ld the conch".**
37170 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71   by taking an sq
37180 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65  lite-style share
37190 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
371a0 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e  nch file, readin
371b0 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
371c0 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20  s and comparing 
371d0 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75  the host's uniqu
371e0 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62  e host ID (see b
371f0 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a  elow) and lock.*
37200 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61  * proxy path aga
37210 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20  inst the values 
37220 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
37230 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20  nch.  The conch 
37240 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65  file is.** store
37250 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  d in the same di
37260 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64  rectory as the d
37270 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
37280 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a   the file name.*
37290 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61  * is patterned a
372a0 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
372b0 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22  e file name as "
372c0 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d  .<databasename>-
372d0 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68  conch"..** If th
372e0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65  e conch file doe
372f0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
37300 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  its contents do 
37310 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a  not match the.**
37320 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20   host ID and/or 
37330 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e  proxy path, then
37340 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63   the lock is esc
37350 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63  alated to an exc
37360 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61  lusive.** lock a
37370 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  nd the conch fil
37380 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70  e contents is up
37390 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68  dated with the h
373a0 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79  ost ID and proxy
373b0 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65  .** path and the
373c0 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61   lock is downgra
373d0 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20  ded to a shared 
373e0 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20  lock again.  If 
373f0 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20  the conch.** is 
37400 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
37410 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20  process (with a 
37420 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68  shared lock), th
37430 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
37440 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  .** will fail an
37450 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  d SQLITE_BUSY is
37460 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
37470 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
37480 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  - a single-byte 
37490 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c  file used for al
374a0 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20  l advisory file 
374b0 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  locks.** normall
374c0 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64  y taken on the d
374d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20  atabase file.   
374e0 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20  This allows for 
374f0 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  safe sharing.** 
37500 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
37510 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c  file for multipl
37520 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  e readers and wr
37530 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  iters on the sam
37540 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63  e.** host (the c
37550 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61  onch ensures tha
37560 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74  t they all use t
37570 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f  he same local lo
37580 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20  ck file)..**.** 
37590 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c  Requesting the l
375a0 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e  ock proxy does n
375b0 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  ot immediately t
375c0 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69  ake the conch, i
375d0 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b  t is.** only tak
375e0 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  en when the firs
375f0 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63  t request to loc
37600 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
37610 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68  is made.  .** Th
37620 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73  is matches the s
37630 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20  emantics of the 
37640 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b  traditional lock
37650 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68  ing behavior, wh
37660 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61  ere.** opening a
37670 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
37680 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
37690 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c  oes not take a l
376a0 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68  ock on it..** Th
376b0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  e shared lock an
376c0 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  d an open file d
376d0 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61  escriptor are ma
376e0 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a  intained until .
376f0 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
37700 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
37710 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a  e is closed. .**
37720 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
37730 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  le and the lock 
37740 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64  file are never d
37750 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f  eleted so they o
37760 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  nly need.** to b
37770 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  e created the fi
37780 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72  rst time they ar
37790 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  e used..**.** Co
377a0 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
377b0 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ons.** ---------
377c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
377d0 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45  **  SQLITE_PREFE
377e0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
377f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61  **.**       Data
37800 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73  base files acces
37810 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c  sed on non-local
37820 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72   file systems ar
37830 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d  e.**       autom
37840 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75  atically configu
37850 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  red for proxy lo
37860 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65  cking, lock file
37870 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e  s are.**       n
37880 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
37890 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ly using the sam
378a0 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20  e logic as.**   
378b0 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
378c0 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74  proxy_file=":aut
378d0 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53  o:".**    .**  S
378e0 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
378f0 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e  G.**.**       En
37900 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e  ables the loggin
37910 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61  g of error messa
37920 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20  ges during host 
37930 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  id file.**      
37940 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63   retrieval and c
37950 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c  reation.**.**  L
37960 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a  OCKPROXYDIR.**.*
37970 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65  *       Override
37980 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69  s the default di
37990 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72  rectory used for
379a0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
379b0 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  s that.**       
379c0 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61  are named automa
379d0 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20  tically via the 
379e0 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67  ":auto:" setting
379f0 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44  .**.**  SQLITE_D
37a00 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
37a10 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a  PERMISSIONS.**.*
37a20 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69  *       Permissi
37a30 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ons to use when 
37a40 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63  creating a direc
37a50 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67  tory for storing
37a60 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f   the.**       lo
37a70 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20  ck proxy files, 
37a80 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c  only used when L
37a90 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e  OCKPROXYDIR is n
37aa0 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a  ot set..**    .*
37ab0 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74  *    .** As ment
37ac0 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65  ioned above, whe
37ad0 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  n compiled with 
37ae0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
37af0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20  OXY_LOCKING,.** 
37b00 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69  setting the envi
37b10 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
37b20 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
37b30 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31  OXY_LOCKING to 1
37b40 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70   will.** force p
37b50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
37b60 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72  be used for ever
37b70 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
37b80 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a  opened, and 0.**
37b90 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f   will force auto
37ba0 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b  matic proxy lock
37bb0 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ing to be disabl
37bc0 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ed for all datab
37bd0 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78  ase.** files (ex
37be0 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67  plicitly calling
37bf0 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
37c00 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
37c10 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
37c20 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
37c30 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
37c40 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
37c50 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
37c60 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
37c70 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
37c80 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
37c90 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
37ca0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
37cb0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
37cc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
37cd0 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  _STYLE../*.** Th
37ce0 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
37cf0 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
37d00 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
37d10 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
37d20 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
37d30 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
37d40 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
37d50 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
37d60 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
37d70 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
37d80 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
37d90 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
37da0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
37db0 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
37dc0 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
37dd0 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
37de0 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
37df0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
37e00 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
37e10 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
37e20 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
37e30 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
37e40 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
37e50 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
37e60 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
37e70 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
37e80 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
37e90 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
37ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
37eb0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
37ec0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
37ed0 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
37ee0 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20      /* 1 if the 
37ef0 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d  conch is held, -
37f00 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  1 if lockless */
37f10 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20  .  int nFails;  
37f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
37f40 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75 72  ch taking failur
37f50 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c  es */.  void *ol
37f60 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
37f70 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
37f80 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20   lockingcontext 
37f90 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c  to restore on cl
37fa0 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ose */.  sqlite3
37fb0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
37fc0 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20  t *pOldMethod;  
37fd0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49     /* Original I
37fe0 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63  /O methods for c
37ff0 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  lose */.};../* .
38000 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
38010 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20  k file path for 
38020 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
38030 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65  dbPath is writte
38040 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a  n into lPath, .*
38050 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69  * which must poi
38060 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69  nt to valid, wri
38070 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72  table memory lar
38080 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20  ge enough for a 
38090 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a  maxLen length.**
380a0 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a   file path. .*/.
380b0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
380c0 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
380d0 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
380e0 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
380f0 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
38100 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
38110 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
38120 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
38130 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
38140 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
38150 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
38160 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
38170 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
38180 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
38190 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53  if( !confstr(_CS
381a0 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
381b0 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
381c0 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f  xLen) ){.      O
381d0 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
381e0 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20  PATH  failed %s 
381f0 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c  errno=%d pid=%d\
38200 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
38210 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c     lPath, errno,
38220 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
38230 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
38240 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
38250 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
38260 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
38270 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d  sqliteplocks", m
38280 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a  axLen);    .  }.
38290 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73  # else.  len = s
382a0 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f  trlcpy(lPath, "/
382b0 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  tmp/", maxLen);.
382c0 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  # endif.#endif..
382d0 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d    if( lPath[len-
382e0 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c  1]!='/' ){.    l
382f0 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
38300 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29  th, "/", maxLen)
38310 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72  ;.  }.  .  /* tr
38320 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70  ansform the db p
38330 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20  ath to a unique 
38340 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  cache name */.  
38350 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  dbLen = (int)str
38360 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66  len(dbPath);.  f
38370 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e  or( i=0; i<dbLen
38380 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69   && (i+len+7)<(i
38390 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b  nt)maxLen; i++){
383a0 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62  .    char c = db
383b0 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61  Path[i];.    lPa
383c0 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d  th[i+len] = (c==
383d0 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a  '/')?'_':c;.  }.
383e0 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27    lPath[i+len]='
383f0 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c  \0';.  strlcat(l
38400 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20  Path, ":auto:", 
38410 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41  maxLen);.  OSTRA
38420 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48  CE(("GETLOCKPATH
38430 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
38440 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  h=%s pid=%d\n", 
38450 6c 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28  lPath, osGetpid(
38460 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  0)));.  return S
38470 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
38480 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65  . ** Creates the
38490 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61   lock file and a
384a0 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63  ny missing direc
384b0 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61  tories in lockPa
384c0 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th. */.static in
384d0 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  t proxyCreateLoc
384e0 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
384f0 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69   *lockPath){.  i
38500 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61  nt i, len;.  cha
38510 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e  r buf[MAXPATHLEN
38520 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  ];.  int start =
38530 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   0;.  .  assert(
38540 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b  lockPath!=NULL);
38550 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65  .  /* try to cre
38560 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65  ate all the inte
38570 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f  rmediate directo
38580 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20  ries */.  len = 
38590 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b  (int)strlen(lock
385a0 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20  Path);.  buf[0] 
385b0 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20  = lockPath[0];. 
385c0 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e   for( i=1; i<len
385d0 3