/ Hex Artifact Content
Login

Artifact 4723f4d963c032b5162dd6de79c314c2f67bccfeea2e458aaefa0f3049877f2e:


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 2a 0a 2a 2a 20 4d 75 74 65 78   it..**.** Mutex
96b0: 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 28   rules:.**.**  (
96c0: 31 29 20 54 68 65 20 70 4c 6f 63 6b 4d 75 74 65  1) The pLockMute
96d0: 78 20 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  x mutex must be 
96e0: 68 65 6c 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  held in order to
96f0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a   read or write.*
9700: 2a 20 20 20 20 20 20 61 6e 79 20 6f 66 20 74 68  *      any of th
9710: 65 20 6c 6f 63 6b 69 6e 67 20 66 69 65 6c 64 73  e locking fields
9720: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 53  :.**          nS
9730: 68 61 72 65 64 2c 20 6e 4c 6f 63 6b 2c 20 65 46  hared, nLock, eF
9740: 69 6c 65 4c 6f 63 6b 2c 20 6f 72 20 62 50 72 6f  ileLock, or bPro
9750: 63 65 73 73 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20  cessLock.**.**  
9760: 28 32 29 20 57 68 65 6e 20 6e 52 65 66 3e 30 2c  (2) When nRef>0,
9770: 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
9780: 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 75  ing fields are u
9790: 6e 63 68 61 6e 67 69 6e 67 20 61 6e 64 20 63 61  nchanging and ca
97a0: 6e 0a 2a 2a 20 20 20 20 20 20 62 65 20 72 65 61  n.**      be rea
97b0: 64 20 28 62 75 74 20 6e 6f 74 20 77 72 69 74 74  d (but not writt
97c0: 65 6e 29 20 77 69 74 68 6f 75 74 20 68 6f 6c 64  en) without hold
97d0: 69 6e 67 20 61 6e 79 20 6d 75 74 65 78 3a 0a 2a  ing any mutex:.*
97e0: 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 49  *          fileI
97f0: 64 2c 20 70 4c 6f 63 6b 4d 75 74 65 78 0a 2a 2a  d, pLockMutex.**
9800: 0a 2a 2a 20 20 28 33 29 20 57 69 74 68 20 74 68  .**  (3) With th
9810: 65 20 65 78 63 65 70 74 69 6f 6e 73 20 61 62 6f  e exceptions abo
9820: 76 65 2c 20 61 6c 6c 20 74 68 65 20 66 69 65 6c  ve, all the fiel
9830: 64 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72  ds may only be r
9840: 65 61 64 0a 2a 2a 20 20 20 20 20 20 6f 72 20 77  ead.**      or w
9850: 72 69 74 74 65 6e 20 77 68 69 6c 65 20 68 6f 6c  ritten while hol
9860: 64 69 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c 20  ding the global 
9870: 75 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75 74 65  unixBigLock mute
9880: 78 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  x..*/.struct uni
9890: 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73  xInodeInfo {.  s
98a0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
98b0: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f   fileId;       /
98c0: 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79  * The lookup key
98d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
98e0: 74 65 78 20 2a 70 4c 6f 63 6b 4d 75 74 65 78 3b  tex *pLockMutex;
98f0: 20 20 20 20 20 20 2f 2a 20 48 6f 6c 64 20 74 68        /* Hold th
9900: 69 73 20 6d 75 74 65 78 20 66 6f 72 2e 2e 2e 20  is mutex for... 
9910: 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64  */.  int nShared
9920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9930: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9940: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
9950: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   held */.  int n
9960: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9980: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
9990: 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  nding file locks
99a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
99b0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
99c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
99d0: 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  f SHARED_LOCK, R
99e0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63  ESERVED_LOCK etc
99f0: 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  . */.  unsigned 
9a00: 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63  char bProcessLoc
9a10: 6b 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  k;       /* An e
9a20: 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73  xclusive process
9a30: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f   lock is held */
9a40: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9a70: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73  pointers to this
9a80: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
9a90: 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
9aa0: 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  mNode;          
9ab0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
9ac0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9ad0: 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20   this inode */. 
9ae0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
9af0: 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20  Unused;         
9b00: 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20   /* Unused file 
9b10: 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63  descriptors to c
9b20: 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  lose */.  unixIn
9b30: 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20  odeInfo *pNext; 
9b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
9b50: 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  t of all unixIno
9b60: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a  deInfo objects *
9b70: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
9b80: 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20  o *pPrev;       
9b90: 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64      /*    .... d
9ba0: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a  oubly linked */.
9bb0: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
9bc0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
9bd0: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
9be0: 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b  long sharedByte;
9bf0: 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d    /* for AFP sim
9c00: 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f  ulated shared lo
9c10: 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ck */.#endif.#if
9c20: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
9c30: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c50: 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d   Named POSIX sem
9c60: 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72  aphore */.  char
9c70: 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41   aSemName[MAX_PA
9c80: 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e  THNAME+2];  /* N
9c90: 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61  ame of that sema
9ca0: 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  phore */.#endif.
9cb0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  };../*.** A list
9cc0: 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f  s of all unixIno
9cd0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a  deInfo objects..
9ce0: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e  */.static unixIn
9cf0: 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69  odeInfo *inodeLi
9d00: 73 74 20 3d 20 30 3b 20 20 2f 2a 20 41 6c 6c 20  st = 0;  /* All 
9d10: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9d20: 6a 65 63 74 73 20 2a 2f 0a 73 74 61 74 69 63 20  jects */.static 
9d30: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 55 6e  unsigned int nUn
9d40: 75 73 65 64 46 64 20 3d 20 30 3b 20 20 20 20 2f  usedFd = 0;    /
9d50: 2a 20 54 6f 74 61 6c 20 75 6e 75 73 65 64 20 66  * Total unused f
9d60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
9d70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  */../*.**.** Thi
9d80: 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69  s function - uni
9d90: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
9da0: 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  ), is only ever 
9db0: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
9dc0: 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45  acro.** unixLogE
9dd0: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74  rror()..**.** It
9de0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
9df0: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
9e00: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
9e10: 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61  ion and errno ha
9e20: 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49  s been.** set. I
9e30: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
9e40: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
9e50: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
9e60: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
9e70: 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e  e of.** errno an
9e80: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
9e90: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
9ea0: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
9eb0: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
9ec0: 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
9ed0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
9ee0: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
9ef0: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
9f00: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
9f10: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
9f20: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
9f30: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
9f40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
9f50: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
9f60: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
9f70: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
9f80: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
9f90: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
9fa0: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
9fb0: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65  hat.** failed (e
9fc0: 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f  .g. "unlink", "o
9fd0: 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73  pen") and the as
9fe0: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
9ff0: 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66  stem path,.** if
a000: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
a010: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c   unixLogError(a,
a020: 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67  b,c)     unixLog
a030: 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c  ErrorAtLine(a,b,
a040: 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  c,__LINE__).stat
a050: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72  ic int unixLogEr
a060: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
a070: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a090: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
a0a0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
a0b0: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
a0c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
a0d0: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
a0e0: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
a0f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
a100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a110: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
a120: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
a130: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a150: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
a160: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
a170: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
a180: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  d */.){.  char *
a190: 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  zErr;           
a1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73            /* Mes
a1b0: 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72  sage from strerr
a1c0: 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65  or() or equivale
a1d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72  nt */.  int iErr
a1e0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20  no = errno;     
a1f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
a200: 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e   syscall error n
a210: 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49  umber */..  /* I
a220: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
a230: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
a240: 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53   (SQLITE_THREADS
a250: 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73  AFE==0), then us
a260: 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72  e.  ** the strer
a270: 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  ror() function t
a280: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d  o obtain the hum
a290: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an-readable erro
a2a0: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65  r message.  ** e
a2b0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72  quivalent to err
a2c0: 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  no. Otherwise, u
a2d0: 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  se strerror_r().
a2e0: 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54  .  */ .#if SQLIT
a2f0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
a300: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52  defined(HAVE_STR
a310: 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20  ERROR_R).  char 
a320: 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73  aErr[80];.  mems
a330: 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65  et(aErr, 0, size
a340: 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72  of(aErr));.  zEr
a350: 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20  r = aErr;..  /* 
a360: 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  If STRERROR_R_CH
a370: 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74  AR_P (set by aut
a380: 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f  oconf scripts) o
a390: 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64  r __USE_GNU is d
a3a0: 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73  efined,.  ** ass
a3b0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
a3c0: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
a3d0: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20   GNU version of 
a3e0: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61  strerror_r() tha
a3f0: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  t.  ** returns a
a400: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
a410: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
a420: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
a430: 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20  e. That pointer 
a440: 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20  .  ** may point 
a450: 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74  to aErr[], or it
a460: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f   may point to so
a470: 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67  me static storag
a480: 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20  e somewhere. .  
a490: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
a4a0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
a4b0: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
a4c0: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
a4d0: 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f  of .  ** strerro
a4e0: 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77  r_r(), which alw
a4f0: 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72  ays writes an er
a500: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
a510: 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20   aErr[]..  **.  
a520: 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69  ** If the code i
a530: 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d  ncorrectly assum
a540: 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  es that it is th
a550: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
a560: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61  that is.  ** ava
a570: 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f  ilable, the erro
a580: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f  r message will o
a590: 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79  ften be an empty
a5a0: 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20   string. Not a. 
a5b0: 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d   ** huge problem
a5c0: 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f  . Incorrectly co
a5d0: 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68  ncluding that th
a5e0: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73  e GNU version is
a5f0: 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a   available .  **
a600: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
a610: 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68   segfault though
a620: 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
a630: 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  ed(STRERROR_R_CH
a640: 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64  AR_P) || defined
a650: 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45  (__USE_GNU).  zE
a660: 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20  rr = .# endif.  
a670: 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e  strerror_r(iErrn
a680: 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28  o, aErr, sizeof(
a690: 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66  aErr)-1);..#elif
a6a0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
a6b0: 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  FE.  /* This is 
a6c0: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
a6d0: 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72  ld, but strerror
a6e0: 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69  _r() is not avai
a6f0: 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72  lable. */.  zErr
a700: 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f   = "";.#else.  /
a710: 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65  * Non-threadsafe
a720: 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65   build, use stre
a730: 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72  rror(). */.  zEr
a740: 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72  r = strerror(iEr
a750: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rno);.#endif..  
a760: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
a770: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c  Path = "";.  sql
a780: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
a790: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78  ,.      "os_unix
a7a0: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
a7b0: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
a7c0: 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a  iLine, iErrno, z
a7d0: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72  Func, zPath, zEr
a7e0: 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  r.  );..  return
a7f0: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
a800: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
a810: 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
a820: 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74  * We assume that
a830: 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20   close() almost 
a840: 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69  always works, si
a850: 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69  nce it is only i
a860: 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b  n a.** very sick
a870: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20   application or 
a880: 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70  on a very sick p
a890: 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20  latform that it 
a8a0: 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49  might fail..** I
a8b0: 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20  f it does fail, 
a8c0: 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20  simply leak the 
a8d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
a8e0: 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a   but do log the.
a8f0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
a900: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
a910: 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72  not safe to retr
a920: 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20  y close() after 
a930: 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a  EINTR since the.
a940: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
a950: 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c  or might have al
a960: 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65  ready been reuse
a970: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72  d by another thr
a980: 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f  ead..** So we do
a990: 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20  n't even try to 
a9a0: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20  recover from an 
a9b0: 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67  EINTR.  Just log
a9c0: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e   the error.** an
a9d0: 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74  d move on..*/.st
a9e0: 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74  atic void robust
a9f0: 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20  _close(unixFile 
aa00: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69  *pFile, int h, i
aa10: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66  nt lineno){.  if
aa20: 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a  ( osClose(h) ){.
aa30: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
aa40: 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f  AtLine(SQLITE_IO
aa50: 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73  ERR_CLOSE, "clos
aa60: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
aa70: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
aa80: 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20   ? pFile->zPath 
aa90: 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  : 0, lineno);.  
aaa0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
aab0: 68 65 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  he pFile->lastEr
aac0: 72 6e 6f 2e 20 20 44 6f 20 74 68 69 73 20 69 6e  rno.  Do this in
aad0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 73   a subroutine as
aae0: 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 0a 2a   that provides.*
aaf0: 2a 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  * a convenient p
ab00: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
ab10: 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  eakpoint..*/.sta
ab20: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 4c 61  tic void storeLa
ab30: 73 74 45 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65  stErrno(unixFile
ab40: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 72 72   *pFile, int err
ab50: 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61  or){.  pFile->la
ab60: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b  stErrno = error;
ab70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
ab80: 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  all file descrip
ab90: 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20  tors accumuated 
aba0: 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  in the unixInode
abb0: 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69  Info->pUnused li
abc0: 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  st..*/ .static v
abd0: 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67  oid closePending
abe0: 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Fds(unixFile *pF
abf0: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
ac00: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
ac10: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
ac20: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
ac30: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
ac40: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
ac50: 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  =pInode->pUnused
ac60: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
ac70: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
ac80: 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  ext;.    robust_
ac90: 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e  close(pFile, p->
aca0: 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
acb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
acc0: 70 29 3b 0a 20 20 20 20 6e 55 6e 75 73 65 64 46  p);.    nUnusedF
acd0: 64 2d 2d 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64  d--;.  }.  pInod
ace0: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
acf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
ad00: 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f   a unixInodeInfo
ad10: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
ad20: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
ad30: 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  by findInodeInfo
ad40: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  ()..**.** The mu
ad50: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
ad60: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
ad70: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
ad80: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
ad90: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
ada0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
adb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
adc0: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e  easeInodeInfo(un
add0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
ade0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
adf0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
ae00: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
ae10: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
ae20: 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  () );.  if( ALWA
ae30: 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20  YS(pInode) ){.  
ae40: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d    pInode->nRef--
ae50: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
ae60: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
ae70: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
ae80: 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  e->pShmNode==0 )
ae90: 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e  ;.      closePen
aea0: 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
aeb0: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
aec0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
aed0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
aee0: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  e->pPrev->pNext=
aef0: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
af00: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
af10: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
af20: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
af30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
af40: 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d  sert( inodeList=
af50: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
af60: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
af70: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
af80: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
af90: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b  pInode->pNext ){
afa0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
afb0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
afc0: 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b  pPrev==pInode );
afd0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
afe0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
aff0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20  pInode->pPrev;. 
b000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
b010: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
b020: 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
b030: 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
b040: 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b  e3_free(pInode);
b050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
b060: 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 21 3d  ert( inodeList!=
b070: 30 20 7c 7c 20 6e 55 6e 75 73 65 64 46 64 3d 3d  0 || nUnusedFd==
b080: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  0 );.}../*.** Gi
b090: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
b0a0: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68  iptor, locate th
b0b0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
b0c0: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64  object that.** d
b0d0: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
b0e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b0f0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
b100: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
b110: 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
b120: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69  lue might be uni
b130: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
b140: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
b150: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
b160: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
b170: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
b180: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
b190: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
b1a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
b1b0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
b1c0: 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72  eturn an appropr
b1d0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
b1e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
b1f0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20  indInodeInfo(.  
b200: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b220: 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68  * Unix file with
b230: 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20   file desc used 
b240: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
b250: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a  unixInodeInfo **
b260: 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f  ppInode        /
b270: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69  * Return the uni
b280: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
b290: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
b2a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b2c0: 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74   System call ret
b2d0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
b2e0: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b300: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
b310: 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f  tor for pFile */
b320: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
b330: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
b340: 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20    /* Lookup key 
b350: 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  for the unixInod
b360: 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63  eInfo */.  struc
b370: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
b380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
b390: 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
b3a0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69  rmation */.  uni
b3b0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
b3c0: 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43  de = 0;     /* C
b3d0: 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f  andidate unixIno
b3e0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  deInfo object */
b3f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ..  assert( unix
b400: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a  MutexHeld() );..
b410: 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76    /* Get low-lev
b420: 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  el information a
b430: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68  bout the file th
b440: 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74  at we can used t
b450: 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  o.  ** create a 
b460: 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20  unique name for 
b470: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
b480: 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a   fd = pFile->h;.
b490: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
b4a0: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
b4b0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
b4c0: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
b4d0: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23  pFile, errno);.#
b4e0: 69 66 20 64 65 66 69 6e 65 64 28 45 4f 56 45 52  if defined(EOVER
b4f0: 46 4c 4f 57 29 20 26 26 20 64 65 66 69 6e 65 64  FLOW) && defined
b500: 28 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f  (SQLITE_DISABLE_
b510: 4c 46 53 29 0a 20 20 20 20 69 66 28 20 70 46 69  LFS).    if( pFi
b520: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
b530: 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72  OVERFLOW ) retur
b540: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a  n SQLITE_NOLFS;.
b550: 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
b560: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
b570: 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50    }..#ifdef __AP
b580: 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53  PLE__.  /* On OS
b590: 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66   X on an msdos f
b5a0: 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69  ilesystem, the i
b5b0: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72  node number is r
b5c0: 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63  eported.  ** inc
b5d0: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72  orrectly for zer
b5e0: 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53  o-size files.  S
b5f0: 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e  ee ticket #3260.
b600: 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61    To work.  ** a
b610: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
b620: 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20  em (we consider 
b630: 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58  it a bug in OS X
b640: 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20  , not SQLite).  
b650: 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63  ** we always inc
b660: 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73  rease the file s
b670: 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74  ize to 1 by writ
b680: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
b690: 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  e.  ** prior to 
b6a0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e  accessing the in
b6b0: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ode number.  The
b6c0: 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65   one byte writte
b6d0: 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43  n is.  ** an ASC
b6e0: 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72  II 'S' character
b6f0: 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70   which also happ
b700: 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69  ens to be the fi
b710: 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e  rst byte.  ** in
b720: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65   the header of e
b730: 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61  very SQLite data
b740: 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77  base.  In this w
b750: 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a  ay, if there.  *
b760: 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  * is a race cond
b770: 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ition such that 
b780: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
b790: 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  as already popul
b7a0: 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69  ated.  ** the fi
b7b0: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
b7c0: 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d  database, no dam
b7d0: 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  age is done..  *
b7e0: 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e  /.  if( statbuf.
b7f0: 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70  st_size==0 && (p
b800: 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20  File->fsFlags & 
b810: 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
b820: 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20  S_MSDOS)!=0 ){. 
b830: 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72     do{ rc = osWr
b840: 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b  ite(fd, "S", 1);
b850: 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
b860: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
b870: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29  .    if( rc!=1 )
b880: 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
b890: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
b8a0: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rno);.      retu
b8b0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
b8c0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
b8d0: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
b8e0: 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  tbuf);.    if( r
b8f0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  c!=0 ){.      st
b900: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
b910: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
b920: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b930: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  IOERR;.    }.  }
b940: 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65  .#endif..  memse
b950: 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69  t(&fileId, 0, si
b960: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
b970: 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74   fileId.dev = st
b980: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69  atbuf.st_dev;.#i
b990: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66  f OS_VXWORKS.  f
b9a0: 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c  ileId.pId = pFil
b9b0: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
b9c0: 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 28 75 36  fileId.ino = (u6
b9d0: 34 29 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  4)statbuf.st_ino
b9e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
b9f0: 74 28 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20  t( inodeList!=0 
ba00: 7c 7c 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30 20  || nUnusedFd==0 
ba10: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  );.  pInode = in
ba20: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
ba30: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
ba40: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
ba50: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
ba60: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
ba70: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
ba80: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
ba90: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
baa0: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
bab0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
bac0: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  ( sizeof(*pInode
bad0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) );.    if( pIn
bae0: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
baf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
bb00: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
bb10: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64      memset(pInod
bb20: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  e, 0, sizeof(*pI
bb30: 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63  node));.    memc
bb40: 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  py(&pInode->file
bb50: 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a  Id, &fileId, siz
bb60: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
bb70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
bb80: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
bb90: 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  utex ){.      pI
bba0: 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
bbb0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
bbc0: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
bbd0: 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
bbe0: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4c 6f   if( pInode->pLo
bbf0: 63 6b 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ckMutex==0 ){.  
bc00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
bc10: 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  ee(pInode);.    
bc20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bc30: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
bc40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bc50: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31  pInode->nRef = 1
bc60: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e  ;.    pInode->pN
bc70: 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ext = inodeList;
bc80: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72  .    pInode->pPr
bc90: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
bca0: 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64  inodeList ) inod
bcb0: 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  eList->pPrev = p
bcc0: 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65  Inode;.    inode
bcd0: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  List = pInode;. 
bce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f   }else{.    pIno
bcf0: 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  de->nRef++;.  }.
bd00: 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e    *ppInode = pIn
bd10: 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ode;.  return SQ
bd20: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
bd30: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
bd40: 20 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20   pFile has been 
bd50: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
bd60: 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77 61 73  ked since it was
bd70: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a   first opened..*
bd80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
bd90: 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69  eHasMoved(unixFi
bda0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20  le *pFile){.#if 
bdb0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74  OS_VXWORKS.  ret
bdc0: 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  urn pFile->pInod
bdd0: 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70  e!=0 && pFile->p
bde0: 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  Id!=pFile->pInod
bdf0: 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23  e->fileId.pId;.#
be00: 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74  else.  struct st
be10: 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e  at buf;.  return
be20: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d   pFile->pInode!=
be30: 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74  0 &&.      (osSt
be40: 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  at(pFile->zPath,
be50: 20 26 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20   &buf)!=0 .     
be60: 20 20 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e      || (u64)buf.
be70: 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70  st_ino!=pFile->p
be80: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e  Inode->fileId.in
be90: 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  o);.#endif.}.../
bea0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69  *.** Check a uni
beb0: 78 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20  xFile that is a 
bec0: 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66  database.  Verif
bed0: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  y the following:
bee0: 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65  .**.** (1) There
bef0: 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
bf00: 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65  hard link on the
bf10: 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65   file.** (2) The
bf20: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73   file is not a s
bf30: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20  ymbolic link.** 
bf40: 28 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73  (3) The file has
bf50: 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65   not been rename
bf60: 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a  d or unlinked.**
bf70: 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65  .** Issue sqlite
bf80: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
bf90: 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67  NING,...) messag
bfa0: 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69  es if anything i
bfb0: 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a  s not right..*/.
bfc0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69  static void veri
bfd0: 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c  fyDbFile(unixFil
bfe0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72  e *pFile){.  str
bff0: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
c000: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
c010: 65 73 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ese verification
c020: 73 20 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65  s occurs for the
c030: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f   main database o
c040: 6e 6c 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  nly */.  if( pFi
c050: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
c060: 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20  UNIXFILE_NOLOCK 
c070: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20  ) return;..  rc 
c080: 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  = osFstat(pFile-
c090: 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28  >h, &buf);.  if(
c0a0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71   rc!=0 ){.    sq
c0b0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
c0c0: 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f  _WARNING, "canno
c0d0: 74 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20  t fstat db file 
c0e0: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
c0f0: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  h);.    return;.
c100: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
c110: 5f 6e 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20  _nlink==0 ){.   
c120: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c130: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
c140: 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c  le unlinked whil
c150: 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69  e open: %s", pFi
c160: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
c170: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
c180: 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31  ( buf.st_nlink>1
c190: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c1a0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
c1b0: 4e 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69  NG, "multiple li
c1c0: 6e 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22  nks to file: %s"
c1d0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
c1e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c1f0: 0a 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f  .  if( fileHasMo
c200: 76 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ved(pFile) ){.  
c210: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
c220: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
c230: 69 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c  ile renamed whil
c240: 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69  e open: %s", pFi
c250: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
c260: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a  return;.  }.}...
c270: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c280: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
c290: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
c2a0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
c2b0: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
c2c0: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
c2d0: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
c2e0: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
c2f0: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
c300: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
c310: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
c320: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
c330: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
c340: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
c350: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
c360: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
c370: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
c380: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
c390: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
c3a0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
c3b0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
c3c0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
c3d0: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
c3e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c3f0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
c400: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
c410: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
c420: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
c430: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
c440: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
c450: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
c460: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73  EDLOCK; );..  as
c470: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
c480: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
c490: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
c4a0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69  D_LOCK );.  sqli
c4b0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c4c0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
c4d0: 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  LockMutex);..  /
c4e0: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
c4f0: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
c500: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
c510: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
c520: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
c530: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
c540: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
c550: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ved = 1;.  }..  
c560: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
c570: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
c580: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
c590: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  .  */.#ifndef __
c5a0: 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72  DJGPP__.  if( !r
c5b0: 65 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c  eserved && !pFil
c5c0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
c5d0: 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73  essLock ){.    s
c5e0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
c5f0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
c600: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
c610: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
c620: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
c630: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
c640: 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c   = 1;.    lock.l
c650: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
c660: 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  .    if( osFcntl
c670: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54  (pFile->h, F_GET
c680: 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  LK, &lock) ){.  
c690: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c6a0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
c6b0: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  VEDLOCK;.      s
c6c0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
c6d0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
c6e0: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
c6f0: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
c700: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
c710: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
c720: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71  }.#endif.  .  sq
c730: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
c740: 65 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  e(pFile->pInode-
c750: 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20  >pLockMutex);.  
c760: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
c770: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
c780: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
c790: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
c7a0: 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
c7b0: 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
c7c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c7d0: 2a 2a 20 53 65 74 20 61 20 70 6f 73 69 78 2d 61  ** Set a posix-a
c7e0: 64 76 69 73 6f 72 79 2d 6c 6f 63 6b 2e 0a 2a 2a  dvisory-lock..**
c7f0: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 77  .** There are tw
c800: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
c810: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 66 20  is routine.  If 
c820: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a  compiled with.**
c830: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c840: 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 74 68 65  ETLK_TIMEOUT the
c850: 6e 20 74 68 65 20 72 6f 75 74 69 6e 65 20 68 61  n the routine ha
c860: 73 20 61 6e 20 65 78 74 72 61 20 70 61 72 61 6d  s an extra param
c870: 65 74 65 72 0a 2a 2a 20 77 68 69 63 68 20 69 73  eter.** which is
c880: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
c890: 75 6e 69 78 46 69 6c 65 2e 20 20 49 66 20 74 68  unixFile.  If th
c8a0: 65 20 75 6e 69 78 46 69 6c 65 2d 3e 69 42 75 73  e unixFile->iBus
c8b0: 79 54 69 6d 65 6f 75 74 0a 2a 2a 20 76 61 6c 75  yTimeout.** valu
c8c0: 65 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69  e is set, then i
c8d0: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
c8e0: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
c8f0: 74 6f 20 77 61 69 74 20 62 65 66 6f 72 65 0a 2a  to wait before.*
c900: 2a 20 66 61 69 6c 69 6e 67 20 74 68 65 20 6c 6f  * failing the lo
c910: 63 6b 2e 20 20 54 68 65 20 69 42 75 73 79 54 69  ck.  The iBusyTi
c920: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 61  meout value is a
c930: 6c 77 61 79 73 20 72 65 73 65 74 20 62 61 63 6b  lways reset back
c940: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 20 6f 6e 20 65   to.** zero on e
c950: 61 63 68 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  ach call..**.** 
c960: 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  If SQLITE_ENABLE
c970: 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 69  _SETLK_TIMEOUT i
c980: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 74  s not defined, t
c990: 68 65 6e 20 64 6f 20 61 20 6e 6f 6e 2d 62 6c 6f  hen do a non-blo
c9a0: 63 6b 69 6e 67 0a 2a 2a 20 61 74 74 65 6d 70 74  cking.** attempt
c9b0: 20 74 6f 20 73 65 74 20 74 68 65 20 6c 6f 63 6b   to set the lock
c9c0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
c9d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b  ITE_ENABLE_SETLK
c9e0: 5f 54 49 4d 45 4f 55 54 0a 23 20 64 65 66 69 6e  _TIMEOUT.# defin
c9f0: 65 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69  e osSetPosixAdvi
ca00: 73 6f 72 79 4c 6f 63 6b 28 68 2c 78 2c 74 29 20  soryLock(h,x,t) 
ca10: 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c  osFcntl(h,F_SETL
ca20: 4b 2c 78 29 0a 23 65 6c 73 65 0a 73 74 61 74 69  K,x).#else.stati
ca30: 63 20 69 6e 74 20 6f 73 53 65 74 50 6f 73 69 78  c int osSetPosix
ca40: 41 64 76 69 73 6f 72 79 4c 6f 63 6b 28 0a 20 20  AdvisoryLock(.  
ca50: 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
ca60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
ca70: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
ca80: 77 68 69 63 68 20 74 6f 20 74 61 6b 65 20 74 68  which to take th
ca90: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 73 74 72 75  e lock */.  stru
caa0: 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c  ct flock *pLock,
cab0: 20 20 2f 2a 20 54 68 65 20 64 65 73 63 72 69 70    /* The descrip
cac0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 63 6b  tion of the lock
cad0: 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
cae0: 70 46 69 6c 65 20 20 20 20 20 20 20 2f 2a 20 53  pFile       /* S
caf0: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 69 6e 67  tructure holding
cb00: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2a   timeout value *
cb10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
cb20: 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c  osFcntl(h,F_SETL
cb30: 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20 77 68 69 6c  K,pLock);.  whil
cb40: 65 28 20 72 63 3c 30 20 26 26 20 70 46 69 6c 65  e( rc<0 && pFile
cb50: 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 3e 30  ->iBusyTimeout>0
cb60: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 20 73 79   ){.    /* On sy
cb70: 73 74 65 6d 73 20 74 68 61 74 20 73 75 70 70 6f  stems that suppo
cb80: 72 74 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20  rt some kind of 
cb90: 62 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 20 6c 6f  blocking file lo
cba0: 63 6b 20 77 69 74 68 20 61 20 74 69 6d 65 6f 75  ck with a timeou
cbb0: 74 2c 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 61  t,.    ** make a
cbc0: 70 70 72 6f 70 72 69 61 74 65 20 63 68 61 6e 67  ppropriate chang
cbd0: 65 73 20 68 65 72 65 20 74 6f 20 69 6e 76 6f 6b  es here to invok
cbe0: 65 20 74 68 61 74 20 62 6c 6f 63 6b 69 6e 67 20  e that blocking 
cbf0: 66 69 6c 65 20 6c 6f 63 6b 2e 20 20 4f 6e 0a 20  file lock.  On. 
cc00: 20 20 20 2a 2a 20 67 65 6e 65 72 69 63 20 70 6f     ** generic po
cc10: 73 69 78 2c 20 68 6f 77 65 76 65 72 2c 20 74 68  six, however, th
cc20: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 41  ere is no such A
cc30: 50 49 2e 20 20 53 6f 20 77 65 20 73 69 6d 70 6c  PI.  So we simpl
cc40: 79 20 74 72 79 20 74 68 65 0a 20 20 20 20 2a 2a  y try the.    **
cc50: 20 6c 6f 63 6b 20 6f 6e 63 65 20 65 76 65 72 79   lock once every
cc60: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 20 75 6e 74   millisecond unt
cc70: 69 6c 20 65 69 74 68 65 72 20 74 68 65 20 74 69  il either the ti
cc80: 6d 65 6f 75 74 20 65 78 70 69 72 65 73 2c 20 6f  meout expires, o
cc90: 72 20 75 6e 74 69 6c 0a 20 20 20 20 2a 2a 20 74  r until.    ** t
cca0: 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
ccb0: 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 75 73 6c 65  ned. */.    usle
ccc0: 65 70 28 31 30 30 30 29 3b 0a 20 20 20 20 72 63  ep(1000);.    rc
ccd0: 20 3d 20 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53   = osFcntl(h,F_S
cce0: 45 54 4c 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20 20  ETLK,pLock);.   
ccf0: 20 70 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d   pFile->iBusyTim
cd00: 65 6f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65  eout--;.  }.  re
cd10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
cd20: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
cd30: 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54  LE_SETLK_TIMEOUT
cd40: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65   */.../*.** Atte
cd50: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
cd60: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
cd70: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
cd80: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
cd90: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
cda0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
cdb0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
cdc0: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
cdd0: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
cde0: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
cdf0: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
ce00: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
ce10: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
ce20: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
ce30: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
ce40: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
ce50: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
ce60: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
ce70: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
ce80: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
ce90: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
cea0: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
ceb0: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
cec0: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
ced0: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
cee0: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
cef0: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
cf00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
cf10: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
cf20: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
cf30: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
cf40: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
cf50: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
cf60: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
cf70: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
cf80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
cf90: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
cfa0: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
cfb0: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
cfc0: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
cfd0: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
cfe0: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
cff0: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
d000: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
d010: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
d020: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
d030: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
d040: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
d050: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
d060: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
d070: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
d080: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
d090: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
d0a0: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
d0b0: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
d0c0: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
d0d0: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
d0e0: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
d0f0: 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  k *pLock){.  int
d100: 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65   rc;.  unixInode
d110: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
d120: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
d130: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d  assert( pInode!=
d140: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
d150: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d160: 64 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  d(pInode->pLockM
d170: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 28  utex) );.  if( (
d180: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
d190: 20 26 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43   & (UNIXFILE_EXC
d1a0: 4c 7c 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  L|UNIXFILE_RDONL
d1b0: 59 29 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58  Y))==UNIXFILE_EX
d1c0: 43 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  CL ){.    if( pI
d1d0: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
d1e0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ck==0 ){.      s
d1f0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
d200: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d210: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
d220: 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   );.      lock.l
d230: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
d240: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
d250: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
d260: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
d270: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
d280: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _SIZE;.      loc
d290: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
d2a0: 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  CK;.      rc = o
d2b0: 73 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72  sSetPosixAdvisor
d2c0: 79 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  yLock(pFile->h, 
d2d0: 26 6c 6f 63 6b 2c 20 70 46 69 6c 65 29 3b 0a 20  &lock, pFile);. 
d2e0: 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20       if( rc<0 ) 
d2f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
d300: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
d310: 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  sLock = 1;.     
d320: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
d330: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d340: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
d350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d360: 20 3d 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76   = osSetPosixAdv
d370: 69 73 6f 72 79 4c 6f 63 6b 28 70 46 69 6c 65 2d  isoryLock(pFile-
d380: 3e 68 2c 20 70 4c 6f 63 6b 2c 20 70 46 69 6c 65  >h, pLock, pFile
d390: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d3a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
d3b0: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
d3c0: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
d3d0: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
d3e0: 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
d3f0: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
d400: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
d410: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
d420: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
d430: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
d440: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
d450: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
d460: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
d470: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
d480: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
d490: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
d4a0: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
d4b0: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
d4c0: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
d4d0: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
d4e0: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
d4f0: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
d500: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
d510: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
d520: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
d530: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
d540: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
d550: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
d560: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
d570: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
d580: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
d590: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
d5a0: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
d5b0: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
d5c0: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
d5d0: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
d5e0: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
d5f0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
d600: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
d610: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
d620: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
d630: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
d640: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
d650: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
d660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
d670: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
d680: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
d690: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
d6a0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
d6b0: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
d6c0: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
d6d0: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
d6e0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
d6f0: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
d700: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
d710: 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68  ing describes th
d720: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
d730: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
d740: 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c  locks and.  ** l
d750: 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ock transitions 
d760: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
d770: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73  POSIX advisory s
d780: 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73  hared and exclus
d790: 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72  ive.  ** lock pr
d7a0: 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64  imitives (called
d7b0: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20   read-locks and 
d7c0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f  write-locks belo
d7d0: 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a  w, to avoid.  **
d7e0: 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
d7f0: 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65  SQLite lock name
d800: 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s). The algorith
d810: 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74  ms are complicat
d820: 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ed.  ** slightly
d830: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
d840: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
d850: 57 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d  Windows95 system
d860: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
d870: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
d880: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
d890: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
d8a0: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
d8b0: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
d8c0: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
d8d0: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
d8e0: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
d8f0: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
d900: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
d910: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
d920: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
d930: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
d940: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
d950: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
d960: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
d970: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
d980: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
d990: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
d9a0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
d9b0: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
d9c0: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
d9d0: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
d9e0: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
d9f0: 75 63 63 65 73 73 66 75 6c 2c 20 27 73 68 61 72  uccessful, 'shar
da00: 65 64 20 62 79 74 65 20 72 61 6e 67 65 27 20 69  ed byte range' i
da10: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20  s read-locked.  
da20: 2a 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ** and the lock 
da30: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
da40: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 20  byte' released. 
da50: 20 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a 20 20   (Legacy note:  
da60: 57 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65  When.  ** SQLite
da70: 20 77 61 73 20 66 69 72 73 74 20 64 65 76 65 6c   was first devel
da80: 6f 70 65 64 2c 20 57 69 6e 64 6f 77 73 39 35 20  oped, Windows95 
da90: 73 79 73 74 65 6d 73 20 77 65 72 65 20 73 74 69  systems were sti
daa0: 6c 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a  ll very common,.
dab0: 20 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73    ** and Widnows
dac0: 39 35 20 6c 61 63 6b 73 20 61 20 73 68 61 72 65  95 lacks a share
dad0: 64 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c 69 74  d-lock capabilit
dae0: 79 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77  y.  So on Window
daf0: 73 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67  s95, a.  ** sing
db00: 6c 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65  le randomly sele
db10: 63 74 65 64 20 62 79 20 66 72 6f 6d 20 74 68 65  cted by from the
db20: 20 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61   'shared byte ra
db30: 6e 67 65 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a  nge' is locked..
db40: 20 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35 20 69    ** Windows95 i
db50: 73 20 6e 6f 77 20 70 72 65 74 74 79 20 6d 75 63  s now pretty muc
db60: 68 20 65 78 74 69 6e 63 74 2c 20 62 75 74 20 74  h extinct, but t
db70: 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  his work-around 
db80: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63  for the.  ** lac
db90: 6b 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b  k of shared-lock
dba0: 73 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c  s on Windows95 l
dbb0: 69 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63  ives on, for bac
dbc0: 6b 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70  kwards.  ** comp
dbd0: 61 74 69 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a  atibility.).  **
dbe0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
dbf0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
dc00: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
dc10: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
dc20: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
dc30: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
dc40: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
dc50: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
dc60: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
dc70: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
dc80: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
dc90: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
dca0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
dcb0: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
dcc0: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
dcd0: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
dce0: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
dcf0: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
dd00: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
dd10: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
dd20: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
dd30: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
dd40: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
dd50: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
dd60: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
dd70: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
dd80: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
dd90: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
dda0: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
ddb0: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
ddc0: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
ddd0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
dde0: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
ddf0: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
de00: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
de10: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
de20: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
de30: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
de40: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
de50: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
de60: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
de70: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
de80: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
de90: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
dea0: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
deb0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
dec0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
ded0: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
dee0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
def0: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
df00: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
df10: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
df20: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
df30: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
df40: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
df50: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
df60: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
df70: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
df80: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f   database. .  */
df90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
dfa0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
dfb0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
dfc0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
dfd0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
dfe0: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
dff0: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45  k lock;.  int tE
e000: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
e010: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
e020: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
e030: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
e040: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
e050: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
e060: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
e070: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
e080: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
e090: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
e0a0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46     azFileLock(pF
e0b0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
e0c0: 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e  leLock), pFile->
e0d0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
e0e0: 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28  .      osGetpid(
e0f0: 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0)));..  /* If t
e100: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
e110: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
e120: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
e130: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
e140: 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
e150: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
e160: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
e170: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
e180: 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
e190: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
e1a0: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
e1b0: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
e1c0: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
e1d0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
e1e0: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
e1f0: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
e200: 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c  held) (unix)\n",
e210: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
e220: 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
e230: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
e240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e250: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
e260: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
e270: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
e280: 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20  s correct..  ** 
e290: 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
e2a0: 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
e2b0: 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
e2c0: 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
e2d0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
e2e0: 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
e2f0: 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
e300: 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
e310: 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
e320: 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
e330: 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
e340: 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
e350: 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
e360: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
e370: 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
e380: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
e390: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e3a0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
e3b0: 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
e3c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
e3d0: 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
e3e0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
e3f0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
e400: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
e410: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
e420: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
e430: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
e440: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
e450: 65 61 64 73 0a 20 20 2a 2f 0a 20 20 70 49 6e 6f  eads.  */.  pIno
e460: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
e470: 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
e480: 74 65 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65  tex_enter(pInode
e490: 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a  ->pLockMutex);..
e4a0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
e4b0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
e4c0: 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
e4d0: 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
e4e0: 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
e4f0: 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
e500: 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
e510: 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
e520: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
e530: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e540: 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
e550: 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20  ock && .        
e560: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
e570: 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
e580: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e  CK || eFileLock>
e590: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
e5a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
e5b0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
e5c0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
e5d0: 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
e5e0: 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
e5f0: 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
e600: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
e610: 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
e620: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
e630: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
e640: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
e650: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
e660: 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
e670: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
e680: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
e690: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
e6a0: 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e  .      (pInode->
e6b0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
e6c0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
e6d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
e6e0: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
e6f0: 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
e700: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
e710: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
e720: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e730: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
e740: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
e750: 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
e760: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
e770: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
e780: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
e790: 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
e7a0: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
e7b0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
e7c0: 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47  ..  /* A PENDING
e7d0: 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
e7e0: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
e7f0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
e800: 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
e810: 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
e820: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
e830: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
e840: 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
e850: 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
e860: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  sed..  */.  lock
e870: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c  .l_len = 1L;.  l
e880: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
e890: 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65  EEK_SET;.  if( e
e8a0: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
e8b0: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
e8c0: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  (eFileLock==EXCL
e8d0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
e8e0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50  ile->eFileLock<P
e8f0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
e900: 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  {.    lock.l_typ
e910: 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d  e = (eFileLock==
e920: 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44  SHARED_LOCK?F_RD
e930: 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20  LCK:F_WRLCK);.  
e940: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e950: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
e960: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e970: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e980: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
e990: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e9a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
e9b0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
e9c0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
e9d0: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
e9e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e9f0: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
ea00: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
ea10: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
ea20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
ea30: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
ea40: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
ea50: 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
ea60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
ea70: 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
ea80: 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
ea90: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
eaa0: 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
eab0: 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
eac0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
ead0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
eae0: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
eaf0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
eb00: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
eb10: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
eb20: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
eb30: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
eb40: 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
eb50: 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
eb60: 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
eb70: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
eb80: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
eb90: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
eba0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28  ED_SIZE;.    if(
ebb0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
ebc0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
ebd0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
ebe0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
ebf0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
ec00: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
ec10: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
ec20: 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OCK);.    }..   
ec30: 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
ec40: 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
ec50: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
ec60: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
ec70: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
ec80: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
ec90: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
eca0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _UNLCK;.    if( 
ecb0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
ecc0: 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63  le, &lock) && rc
ecd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ece0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75       /* This cou
ecf0: 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  ld happen with a
ed00: 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a   network mount *
ed10: 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  /.      tErrno =
ed20: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
ed30: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
ed40: 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a  UNLOCK; .    }..
ed50: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ed60: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ed70: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
ed80: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
ed90: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
eda0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
edb0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
edc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
edd0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ede0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
edf0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
ee00: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
ee10: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
ee20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
ee30: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
ee40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
ee50: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
ee60: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
ee70: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
ee80: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
ee90: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
eea0: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
eeb0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
eec0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
eed0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
eee0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
eef0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
ef00: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
ef10: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
ef20: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
ef30: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
ef40: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
ef50: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
ef60: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
ef70: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
ef80: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
ef90: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
efa0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
efb0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
efc0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
efd0: 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
efe0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
eff0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
f000: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
f010: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
f020: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
f030: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
f040: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
f050: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
f060: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
f070: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
f080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
f090: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f0a0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f0b0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f0c0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
f0d0: 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
f0e0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f0f0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
f100: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f110: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f120: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
f130: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
f140: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
f150: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
f160: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
f170: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
f180: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
f190: 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
f1a0: 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66  }.  }.  ..#ifdef
f1b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
f1c0: 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72  /* Set up the tr
f1d0: 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65  ansaction-counte
f1e0: 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e  r change checkin
f1f0: 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a  g flags when.  *
f200: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  * transitioning 
f210: 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f  from a SHARED to
f220: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
f230: 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20  .  The change.  
f240: 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ** from SHARED t
f250: 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73  o RESERVED marks
f260: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
f270: 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20  f a normal.  ** 
f280: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
f290: 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e  (not a hot journ
f2a0: 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20  al rollback)..  
f2b0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
f2c0: 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69  ITE_OK.   && pFi
f2d0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  le->eFileLock<=S
f2e0: 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26  HARED_LOCK.   &&
f2f0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
f300: 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20  RVED_LOCK.  ){. 
f310: 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
f320: 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ntrChng = 0;.   
f330: 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
f340: 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
f350: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
f360: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   1;.  }.#endif..
f370: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f380: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
f390: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
f3a0: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49  FileLock;.    pI
f3b0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f3c0: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
f3d0: 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
f3e0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
f3f0: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
f400: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
f410: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
f420: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f430: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
f440: 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a  .  }..end_lock:.
f450: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f460: 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c  leave(pInode->pL
f470: 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54  ockMutex);.  OST
f480: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
f490: 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e  d %s %s (unix)\n
f4a0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
f4b0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
f4c0: 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  k), .      rc==S
f4d0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
f4e0: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
f4f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f500: 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65  .** Add the file
f510: 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
f520: 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   by file handle 
f530: 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72  pFile to the cor
f540: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55  responding.** pU
f550: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nused list..*/.s
f560: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65  tatic void setPe
f570: 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65  ndingFd(unixFile
f580: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
f590: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
f5a0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
f5b0: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
f5c0: 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50  d *p = pFile->pP
f5d0: 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
f5e0: 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  d;.  p->pNext = 
f5f0: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
f600: 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
f610: 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d  ed = p;.  pFile-
f620: 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65  >h = -1;.  pFile
f630: 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55  ->pPreallocatedU
f640: 6e 75 73 65 64 20 3d 20 30 3b 0a 20 20 6e 55 6e  nused = 0;.  nUn
f650: 75 73 65 64 46 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  usedFd++;.}../*.
f660: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
f670: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
f680: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
f690: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
f6a0: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
f6b0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
f6c0: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
f6d0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
f6e0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
f6f0: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
f700: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
f710: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
f720: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
f730: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
f740: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f750: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20  a no-op..** .** 
f760: 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  If handleNFSUnlo
f770: 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ck is true, then
f780: 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   on downgrading 
f790: 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  an EXCLUSIVE_LOC
f7a0: 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74  K to SHARED.** t
f7b0: 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73  he byte range is
f7c0: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20   divided into 2 
f7d0: 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69  parts and the fi
f7e0: 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f  rst part is unlo
f7f0: 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74  cked then.** set
f800: 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c   to a read lock,
f810: 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20   then the other 
f820: 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75  part is simply u
f830: 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77  nlocked.  This w
f840: 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20  orks .** around 
f850: 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53  a bug in BSD NFS
f860: 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65   lockd (also see
f870: 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33  n on MacOSX 10.3
f880: 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f  +) that fails to
f890: 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20   .** remove the 
f8a0: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20  write lock on a 
f8b0: 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65  region when a re
f8c0: 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a  ad lock is set..
f8d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
f8e0: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
f8f0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
f900: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
f910: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
f920: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
f930: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
f940: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
f950: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
f960: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
f970: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
f980: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
f990: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
f9a0: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
f9b0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
f9c0: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
f9d0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
f9e0: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
f9f0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
fa00: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
fa10: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
fa20: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
fa30: 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74  red,.      osGet
fa40: 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73  pid(0)));..  ass
fa50: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
fa60: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
fa70: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
fa80: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
fa90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
faa0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
fab0: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
fac0: 70 49 6e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65  pInode;.  sqlite
fad0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 49  3_mutex_enter(pI
fae0: 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
faf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
fb00: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
fb10: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
fb20: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
fb30: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
fb40: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
fb50: 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
fb60: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66  FileLock );..#if
fb70: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
fb80: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
fb90: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
fba0: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
fbb0: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
fbc0: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
fbd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
fbe0: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
fbf0: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
fc00: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
fc10: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
fc20: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
fc30: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
fc40: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
fc50: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
fc60: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
fc70: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
fc80: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
fc90: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
fca0: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
fcb0: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
fcc0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
fcd0: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
fce0: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
fcf0: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
fd00: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
fd10: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
fd20: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
fd30: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
fd40: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
fd50: 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e    */.    pFile->
fd60: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
fd70: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
fd80: 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f  * downgrading to
fd90: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
fda0: 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63  n NFS involves c
fdb0: 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74  learing the writ
fdc0: 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65  e lock.    ** be
fdd0: 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e  fore establishin
fde0: 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d  g the readlock -
fdf0: 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65   to avoid a race
fe00: 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f   condition we do
fe10: 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74  wngrade.    ** t
fe20: 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f  he lock in 2 blo
fe30: 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72  cks, so that par
fe40: 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77  t of the range w
fe50: 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62  ill be covered b
fe60: 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74  y a .    ** writ
fe70: 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65  e lock until the
fe80: 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64   rest is covered
fe90: 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a   by a read lock:
fea0: 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57  .    **  1:   [W
feb0: 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a  WWWW].    **  2:
fec0: 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a     [....W].    *
fed0: 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a  *  3:   [RRRRW].
fee0: 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52      **  4:   [RR
fef0: 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RR.].    */.    
ff00: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
ff10: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69  HARED_LOCK ){.#i
ff20: 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  f !defined(__APP
ff30: 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45  LE__) || !SQLITE
ff40: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
ff50: 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69  STYLE.      (voi
ff60: 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  d)handleNFSUnloc
ff70: 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
ff80: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
ff90: 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==0 );.#endif.#i
ffa0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
ffb0: 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
ffc0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
ffd0: 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61  YLE.      if( ha
ffe0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b  ndleNFSUnlock ){
fff0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
10000 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
10010 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
10020 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
10030 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
10040 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a      off_t divSiz
10050 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20  e = SHARED_SIZE 
10060 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  - 1;.        .  
10070 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
10080 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
10090 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
100a0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
100b0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
100c0 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
100d0 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
100e0 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
100f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
10100 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10110 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
10120 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
10130 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
10140 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10150 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
10160 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
10170 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
10180 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
10190 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
101a0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
101b0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
101c0 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
101d0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
101e0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
101f0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
10200 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
10210 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
10220 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
10230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
10240 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10250 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
10260 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
10270 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
10280 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10290 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
102a0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
102b0 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
102c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
102d0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
102e0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
102f0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
10300 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
10310 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10320 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
10330 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
10340 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
10350 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
10360 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10370 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
10380 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
10390 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
103a0 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a  _FIRST+divSize;.
103b0 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
103c0 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
103d0 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  -divSize;.      
103e0 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
103f0 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
10400 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
10410 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
10420 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
10430 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
10440 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
10450 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
10460 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
10470 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
10480 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
10490 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
104a0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  e.#endif /* defi
104b0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
104c0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
104d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
104e0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
104f0 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
10500 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
10510 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
10520 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
10530 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10540 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
10550 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
10560 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
10570 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
10580 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
10590 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
105a0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
105b0 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  y, the call to u
105c0 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61  nixFileLock() ca
105d0 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73  nnot fail becaus
105e0 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20  e another.      
105f0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69      ** process i
10600 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63  s holding an inc
10610 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20  ompatible lock. 
10620 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73  If it does, this
10630 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
10640 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
10650 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
10660 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
10670 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20   the locking.   
10680 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63         ** protoc
10690 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ol. If this happ
106a0 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ens, return SQLI
106b0 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e  TE_IOERR_RDLOCK.
106c0 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   Returning.     
106d0 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42       ** SQLITE_B
106e0 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73  USY would confus
106f0 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  e the upper laye
10700 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69  r (in practice i
10710 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20  t causes .      
10720 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74      ** an assert
10730 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20   to fail). */ . 
10740 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10750 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
10760 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  K;.          sto
10770 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
10780 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
10790 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
107a0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
107b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
107c0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
107d0 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_UNLCK;.    loc
107e0 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
107f0 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
10800 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
10810 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
10820 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73  .l_len = 2L;  as
10830 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59  sert( PENDING_BY
10840 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42  TE+1==RESERVED_B
10850 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75  YTE );.    if( u
10860 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
10870 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
10880 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
10890 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
108a0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
108b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
108c0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
108d0 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
108e0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
108f0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rno);.      goto
10900 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
10910 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69   }.  }.  if( eFi
10920 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
10930 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  ){.    /* Decrem
10940 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
10950 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
10960 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
10970 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
10980 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
10990 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
109a0 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
109b0 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
109c0 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
109d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
109e0 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20  de->nShared--;. 
109f0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
10a00 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Shared==0 ){.   
10a10 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
10a20 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
10a30 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
10a40 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
10a50 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
10a60 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
10a70 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
10a80 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
10a90 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
10aa0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
10ab0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
10ac0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10ad0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10ae0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
10af0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
10b00 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
10b10 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  no);.        pIn
10b20 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
10b30 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
10b40 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
10b50 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
10b60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10b70 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
10b80 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
10b90 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
10ba0 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
10bb0 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
10bc0 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
10bd0 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
10be0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
10bf0 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
10c00 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
10c10 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
10c20 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
10c30 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
10c40 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73  nLock--;.    ass
10c50 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
10c60 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ck>=0 );.    if(
10c70 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
10c80 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 ){.      close
10c90 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
10ca0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e  );.    }.  }..en
10cb0 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69  d_unlock:.  sqli
10cc0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10cd0 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
10ce0 65 78 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ex);.  if( rc==S
10cf0 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
10d00 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
10d10 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
10d20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
10d30 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
10d40 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
10d50 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
10d60 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
10d70 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
10d80 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
10d90 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
10da0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
10db0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
10dc0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
10dd0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
10de0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
10df0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
10e00 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
10e10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
10e20 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
10e30 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71  nt unixUnlock(sq
10e40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
10e50 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
10e60 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
10e70 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73  MAP_SIZE>0.  ass
10e80 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
10e90 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28  SHARED_LOCK || (
10ea0 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d  (unixFile *)id)-
10eb0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
10ec0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
10ed0 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c   posixUnlock(id,
10ee0 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a   eFileLock, 0);.
10ef0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
10f00 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74  X_MMAP_SIZE>0.st
10f10 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70  atic int unixMap
10f20 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
10f30 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a  Fd, i64 nByte);.
10f40 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
10f50 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  Unmapfile(unixFi
10f60 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66  le *pFd);.#endif
10f70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
10f80 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74  ction performs t
10f90 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  he parts of the 
10fa0 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65  "close file" ope
10fb0 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f  ration .** commo
10fc0 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
10fd0 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f   schemes. It clo
10fe0 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  ses the director
10ff0 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61  y and file.** ha
11000 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61  ndles, if they a
11010 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65  re valid, and se
11020 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66  ts all fields of
11030 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a   the unixFile.**
11040 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e   structure to 0.
11050 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f  .**.** It is *no
11060 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  t* necessary to 
11070 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77  hold the mutex w
11080 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
11090 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65   is called,.** e
110a0 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20  ven on VxWorks. 
110b0 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65   A mutex will be
110c0 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57   acquired on VxW
110d0 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76  orks by the.** v
110e0 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
110f0 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  eId() routine..*
11100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f  /.static int clo
11110 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74  seUnixFile(sqlit
11120 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
11130 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11140 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11150 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
11160 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
11170 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  ixUnmapfile(pFil
11180 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  e);.#endif.  if(
11190 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a   pFile->h>=0 ){.
111a0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
111b0 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  (pFile, pFile->h
111c0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
111d0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
111e0 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52    }.#if OS_VXWOR
111f0 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  KS.  if( pFile->
11200 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70  pId ){.    if( p
11210 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
11220 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  & UNIXFILE_DELET
11230 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  E ){.      osUnl
11240 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e  ink(pFile->pId->
11250 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
11260 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72  .    }.    vxwor
11270 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
11280 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20  pFile->pId);.   
11290 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b   pFile->pId = 0;
112a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
112b0 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b  ef SQLITE_UNLINK
112c0 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69  _AFTER_CLOSE.  i
112d0 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
112e0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
112f0 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55  ELETE ){.    osU
11300 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61  nlink(pFile->zPa
11310 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
11320 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26  _free(*(char**)&
11330 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
11340 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20     pFile->zPath 
11350 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
11360 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
11370 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69  E   %-3d\n", pFi
11380 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43  le->h));.  OpenC
11390 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
113a0 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
113b0 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55  ->pPreallocatedU
113c0 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74  nused);.  memset
113d0 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
113e0 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
113f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
11410 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
11420 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65  ic int unixClose
11430 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11440 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  d){.  int rc = S
11450 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
11460 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11470 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
11480 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 46 69  verifyDbFile(pFi
11490 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  le);.  unixUnloc
114a0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
114b0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
114c0 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69  ();..  /* unixFi
114d0 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77  le.pInode is alw
114e0 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20  ays valid here. 
114f0 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66  Otherwise, a dif
11500 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a  ferent close.  *
11510 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20  * routine (e.g. 
11520 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77  nolockClose()) w
11530 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69  ould be called i
11540 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61  nstead..  */.  a
11550 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49  ssert( pFile->pI
11560 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c  node->nLock>0 ||
11570 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
11580 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
11590 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
115a0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26  pFile->pInode) &
115b0 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
115c0 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
115d0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
115e0 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
115f0 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
11600 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
11610 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20  just.    ** yet 
11620 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
11630 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
11640 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
11650 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
11660 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
11670 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  o pInode->pUnuse
11680 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
11690 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
116a0 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a  y closed .    **
116b0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
116c0 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
116d0 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65      */.    setPe
116e0 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
116f0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f    }.  releaseIno
11700 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
11710 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
11720 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c  ile(id);.  unixL
11730 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
11740 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a  eturn rc;.}../**
11750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
11760 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64   of the posix ad
11770 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c  visory lock impl
11780 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
11790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
117a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
117f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d  ************ No-
11860 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  op Locking *****
11870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11890 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f  .** Of the vario
118a0 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  us locking imple
118b0 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c  mentations avail
118c0 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79  able, this is by
118d0 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70   far the.** simp
118e0 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69  lest:  locking i
118f0 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61  s ignored.  No a
11900 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
11910 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  o lock the datab
11920 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  ase.** file for 
11930 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
11940 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c  ng..**.** This l
11950 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61  ocking mode is a
11960 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75  ppropriate for u
11970 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  se on read-only 
11980 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78  databases.** (ex
11990 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  : databases that
119a0 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f   are burned into
119b0 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61   CD-ROM, for exa
119c0 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a  mple.)  It can.*
119d0 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69  * also be used i
119e0 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
119f0 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65  n employs some e
11a00 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73  xternal mechanis
11a10 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20  m to.** prevent 
11a20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63  simultaneous acc
11a30 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ess of the same 
11a40 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20  database by two 
11a50 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62  or more.** datab
11a60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
11a70 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61    But there is a
11a80 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66   serious risk of
11a90 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72   database.** cor
11aa0 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20  ruption if this 
11ab0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
11ac0 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f  used in situatio
11ad0 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c  ns where multipl
11ae0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
11af0 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63  nnections are ac
11b00 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
11b10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
11b20 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69  t the same.** ti
11b30 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f  me and one or mo
11b40 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e  re of those conn
11b50 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74  ections are writ
11b60 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  ing..*/..static 
11b70 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  int nolockCheckR
11b80 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
11b90 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
11ba0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
11bb0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
11bc0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
11bd0 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20   *pResOut = 0;. 
11be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11bf0 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
11c00 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  nolockLock(sqlit
11c10 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
11c20 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b  , int NotUsed2){
11c30 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11c40 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
11c50 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
11c60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
11c70 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
11c80 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
11c90 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
11ca0 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
11cb0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
11cc0 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
11cd0 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
11ce0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11cf0 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  * Close the file
11d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11d10 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  nolockClose(sqli
11d20 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
11d30 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
11d40 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f  ixFile(id);.}../
11d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d60 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
11d70 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  o-op lock implem
11d80 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
11d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
11df0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
11e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
11e60 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67  dot-file Locking
11e70 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
11e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11e90 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c  **.** The dotfil
11ea0 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
11eb0 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68  entation uses th
11ec0 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73  e existence of s
11ed0 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20  eparate lock.** 
11ee0 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20  files (really a 
11ef0 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f  directory) to co
11f00 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20  ntrol access to 
11f10 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
11f20 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20  his works.** on 
11f30 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79  just about every
11f40 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67   filesystem imag
11f50 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65  inable.  But the
11f60 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64  re are serious d
11f70 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20  ownsides:.**.** 
11f80 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73     (1)  There is
11f90 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63   zero concurrenc
11fa0 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61  y.  A single rea
11fb0 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f  der blocks all o
11fc0 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ther.**         
11fd0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  connections from
11fe0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
11ff0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
12000 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
12010 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  An application c
12020 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f  rash or power lo
12030 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61  ss can leave sta
12040 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a  le lock files.**
12050 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67           sitting
12060 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65   around that nee
12070 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20  d to be cleared 
12080 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  manually..**.** 
12090 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20  Nevertheless, a 
120a0 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70  dotlock is an ap
120b0 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
120c0 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69  g mode for use i
120d0 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f  f no.** other lo
120e0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69  cking strategy i
120f0 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  s available..**.
12100 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  ** Dotfile locki
12110 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61  ng works by crea
12120 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74  ting a subdirect
12130 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ory in the same 
12140 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20  directory as.** 
12150 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
12160 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
12170 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22  ame but with a "
12180 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e  .lock" extension
12190 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65   added..** The e
121a0 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f  xistence of a lo
121b0 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70  ck directory imp
121c0 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56  lies an EXCLUSIV
121d0 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68  E lock.  All oth
121e0 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73  er.** lock types
121f0 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56   (SHARED, RESERV
12200 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65  ED, PENDING) are
12210 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43   mapped into EXC
12220 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  LUSIVE..*/../*.*
12230 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69  * The file suffi
12240 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64  x added to the d
12250 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d  ata base filenam
12260 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
12270 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  eate the.** lock
12280 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23   directory..*/.#
12290 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53  define DOTLOCK_S
122a0 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f  UFFIX ".lock"../
122b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
122c0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
122d0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
122e0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
122f0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
12300 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
12310 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
12320 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
12330 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
12340 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
12350 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
12360 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
12370 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
12380 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
12390 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
123a0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
123b0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
123c0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
123d0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  checking..**.** 
123e0 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  In dotfile locki
123f0 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63  ng, either a loc
12400 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64  k exists or it d
12410 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20  oes not.  So in 
12420 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f  this.** variatio
12430 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76  n of CheckReserv
12440 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f  edLock(), *pResO
12450 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ut is set to tru
12460 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a  e if any lock.**
12470 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
12480 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69  file and false i
12490 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
124a0 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  locked..*/.stati
124b0 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65  c int dotlockChe
124c0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
124d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
124e0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
124f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12500 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
12510 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
12520 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12530 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
12540 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12550 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
12560 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
12570 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
12580 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12590 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f  ;.  reserved = o
125a0 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74 20 63  sAccess((const c
125b0 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
125c0 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29 3d 3d  ingContext, 0)==
125d0 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  0;.  OSTRACE(("T
125e0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
125f0 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
12600 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
12610 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a   reserved));.  *
12620 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
12630 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
12640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
12650 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
12660 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
12670 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
12680 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
12690 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
126a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
126b0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
126c0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
126d0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
126e0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
126f0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
12700 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
12710 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
12720 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
12730 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
12740 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
12750 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
12760 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
12770 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
12780 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
12790 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
127a0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
127b0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
127c0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
127d0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
127e0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
127f0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
12800 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
12810 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
12820 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
12830 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
12840 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
12850 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
12860 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
12870 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
12880 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
12890 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
128a0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
128b0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
128c0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
128d0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
128e0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
128f0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
12900 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
12910 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
12920 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
12930 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
12940 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
12950 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
12960 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
12970 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
12980 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
12990 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
129a0 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
129b0 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
129c0 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
129d0 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
129e0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
129f0 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
12a00 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12a10 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
12a20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12a30 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
12a40 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
12a50 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
12a60 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
12a70 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  text;.  int rc =
12a80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20   SQLITE_OK;...  
12a90 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e  /* If we have an
12aa0 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  y lock, then the
12ab0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61   lock file alrea
12ac0 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20  dy exists.  All 
12ad0 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
12ae0 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72  do is adjust our
12af0 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
12b00 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76   of the lock lev
12b10 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  el..  */.  if( p
12b20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12b30 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  > NO_LOCK ){.   
12b40 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12b50 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
12b60 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64     /* Always upd
12b70 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  ate the timestam
12b80 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c  p on the old fil
12b90 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45  e */.#ifdef HAVE
12ba0 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65  _UTIME.    utime
12bb0 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c  (zLockFile, NULL
12bc0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69  );.#else.    uti
12bd0 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  mes(zLockFile, N
12be0 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ULL);.#endif.   
12bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12c00 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
12c10 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
12c20 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20   lock */.  rc = 
12c30 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osMkdir(zLockFil
12c40 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20  e, 0777);.  if( 
12c50 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66  rc<0 ){.    /* f
12c60 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72  ailed to open/cr
12c70 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69  eate the lock di
12c80 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69  rectory */.    i
12c90 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
12ca0 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53  o;.    if( EEXIS
12cb0 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T == tErrno ){. 
12cc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12cd0 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
12ce0 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e {.      rc = s
12cf0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
12d00 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
12d10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
12d20 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
12d30 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
12d40 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
12d50 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
12d60 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
12d70 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
12d80 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20  n rc;.  } .  .  
12d90 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
12da0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
12db0 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
12dc0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
12dd0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
12de0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
12df0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
12e00 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
12e10 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
12e20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
12e30 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
12e40 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
12e50 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
12e60 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
12e70 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
12e80 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
12e90 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
12ea0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
12eb0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
12ec0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
12ed0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
12ee0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  -op..**.** When 
12ef0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
12f00 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43  l reaches NO_LOC
12f10 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  K, delete the lo
12f20 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ck file..*/.stat
12f30 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
12f40 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
12f50 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
12f60 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
12f70 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
12f80 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61  xFile*)id;.  cha
12f90 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
12fa0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
12fb0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
12fc0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
12fd0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
12fe0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
12ff0 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
13000 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22  =%d (dotlock)\n"
13010 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
13020 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
13030 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13040 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  ck, osGetpid(0))
13050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
13060 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
13070 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
13080 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
13090 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
130a0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
130b0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
130c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
130d0 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e   }..  /* To down
130e0 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c  grade to shared,
130f0 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f   simply update o
13100 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69  ur internal noti
13110 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c  on of the.  ** l
13120 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e  ock state.  No n
13130 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68  eed to mess with
13140 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
13150 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
13160 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
13170 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
13180 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
13190 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
131a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
131b0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f  ;.  }.  .  /* To
131c0 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68   fully unlock th
131d0 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65  e database, dele
131e0 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
131f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46   */.  assert( eF
13200 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
13210 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64   );.  rc = osRmd
13220 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20  ir(zLockFile);. 
13230 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
13240 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
13250 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74 45 72  rno;.    if( tEr
13260 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20  rno==ENOENT ){. 
13270 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13280 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
13290 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
132a0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
132b0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
132c0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
132d0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  no);.    }.    r
132e0 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
132f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13300 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
13310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
13330 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75  a file.  Make su
13340 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  re the lock has 
13350 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65  been released be
13360 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f  fore closing..*/
13370 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
13380 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
13390 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75  _file *id) {.  u
133a0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
133b0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
133c0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
133d0 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  );.  dotlockUnlo
133e0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
133f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13400 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
13410 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75 72 6e  ntext);.  return
13420 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
13430 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  d);.}./*********
13440 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
13450 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f   the dot-file lo
13460 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
13470 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
13480 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
13490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134d0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
134e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13520 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13540 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f  * Begin flock Lo
13550 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
13560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13570 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  ******.**.** Use
13580 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73   the flock() sys
13590 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66  tem call to do f
135a0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  ile locking..**.
135b0 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  ** flock() locki
135c0 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66  ng is like dot-f
135d0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  ile locking in t
135e0 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a  hat the various.
135f0 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f  ** fine-grain lo
13600 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70  cking levels sup
13610 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  ported by SQLite
13620 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69   are collapsed i
13630 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
13640 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
13650 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
13660 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
13670 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e  D, and.** PENDIN
13680 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20  G locks are the 
13690 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e  same thing as an
136a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
136b0 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c    SQLite.** stil
136c0 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75  l works when you
136d0 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f   do this, but co
136e0 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64  ncurrency is red
136f0 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e  uced since.** on
13700 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
13710 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ess can be readi
13720 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
13730 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  at a time..**.**
13740 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69   Omit this secti
13750 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  on if SQLITE_ENA
13760 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
13770 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 0a  E is turned off.
13780 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
13790 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
137a0 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  LE../*.** Retry 
137b0 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68  flock() calls th
137c0 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e  at fail with EIN
137d0 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e  TR.*/.#ifdef EIN
137e0 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  TR.static int ro
137f0 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66  bust_flock(int f
13800 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  d, int op){.  in
13810 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
13820 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d   flock(fd,op); }
13830 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
13840 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
13850 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
13860 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62  lse.# define rob
13870 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66  ust_flock(a,b) f
13880 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66  lock(a,b).#endif
13890 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .     ../*.** Th
138a0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
138b0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
138c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
138d0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
138e0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
138f0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
13900 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
13910 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
13920 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
13930 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
13940 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
13950 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
13960 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
13970 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
13980 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
13990 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
139a0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
139b0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
139c0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
139d0 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
139e0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
139f0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
13a00 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
13a10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13a20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
13a30 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
13a40 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13a50 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
13a60 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
13a70 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
13a80 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
13a90 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
13aa0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
13ab0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
13ac0 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
13ad0 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
13ae0 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
13af0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13b00 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
13b10 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
13b20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
13b30 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
13b40 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
13b50 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
13b60 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
13b70 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70  ){.    /* attemp
13b80 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
13b90 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  k */.    int lrc
13ba0 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
13bb0 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
13bc0 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
13bd0 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20    if( !lrc ){.  
13be0 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
13bf0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
13c00 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f  /.      lrc = ro
13c10 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
13c20 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
13c30 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
13c40 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
13c50 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
13c60 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
13c70 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
13c80 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
13c90 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  lrc = SQLITE_IOE
13ca0 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20  RR_UNLOCK; .    
13cb0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
13cc0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
13cd0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
13ce0 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lrc;.      }.   
13cf0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
13d00 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
13d10 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76  no;.      reserv
13d20 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a  ed = 1;.      /*
13d30 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69   someone else mi
13d40 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65  ght have it rese
13d50 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72  rved */.      lr
13d60 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
13d70 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
13d80 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
13d90 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20  RR_LOCK); .     
13da0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
13db0 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
13dc0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
13dd0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
13de0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
13df0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
13e00 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
13e10 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
13e20 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c  d %d %d (flock)\
13e30 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
13e40 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23  , reserved));..#
13e50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
13e60 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13e70 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
13e80 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49 54  & 0xff) == SQLIT
13e90 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
13ea0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13eb0 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
13ec0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
13ed0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
13ee0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
13ef0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
13f00 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
13f10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
13f20 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
13f30 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
13f40 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
13f50 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
13f60 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
13f70 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
13f80 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
13f90 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
13fa0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
13fb0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
13fc0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
13fd0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
13fe0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
13ff0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
14000 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
14010 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
14020 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
14030 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
14040 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
14050 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
14060 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
14070 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
14080 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
14090 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
140a0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
140b0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
140c0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
140d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
140e0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
140f0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
14100 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
14110 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
14120 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
14130 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
14140 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
14150 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
14160 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
14170 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14180 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
14190 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
141a0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
141b0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
141c0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
141d0 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
141e0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
141f0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
14200 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
14210 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
14220 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
14230 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
14240 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
14250 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
14260 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
14270 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
14280 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
14290 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
142a0 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
142b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
142c0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
142d0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
142e0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
142f0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
14300 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
14310 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
14320 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
14330 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
14340 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14350 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
14360 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14370 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
14380 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14390 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
143a0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
143b0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
143c0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
143d0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
143e0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
143f0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
14400 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
14410 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
14420 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
14430 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
14440 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14450 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
14460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14470 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
14480 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
14490 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f  k */.  .  if (ro
144a0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
144b0 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
144c0 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
144d0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
144e0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
144f0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
14500 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
14510 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
14520 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
14530 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
14540 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
14550 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
14560 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
14570 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
14580 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rrno);.    }.  }
14590 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67   else {.    /* g
145a0 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
145b0 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
145c0 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  k */.    pFile->
145d0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
145e0 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54  eLock;.  }.  OST
145f0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
14600 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c  d %s %s (flock)\
14610 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
14620 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
14630 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ck), .          
14640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
14650 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
14660 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
14670 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
14680 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
14690 20 28 72 63 20 26 20 30 78 66 66 29 20 3d 3d 20   (rc & 0xff) == 
146a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
146b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
146c0 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BUSY;.  }.#endif
146d0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
146e0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
146f0 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ORS */.  return 
14700 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  rc;.}.../*.** Lo
14710 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
14720 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
14730 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
14740 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
14750 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
14760 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
14770 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
14780 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
14790 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
147a0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
147b0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
147c0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
147d0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
147e0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
147f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
14800 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
14810 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  t flockUnlock(sq
14820 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
14830 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
14840 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
14850 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
14860 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  id;.  .  assert(
14870 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
14880 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
14890 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
148a0 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
148b0 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
148c0 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
148d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
148e0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
148f0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
14900 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
14910 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
14920 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
14930 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
14940 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
14950 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
14960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
14970 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
14980 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
14990 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
149a0 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
149b0 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
149c0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
149d0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
149e0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
149f0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
14a00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14a10 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
14a20 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
14a30 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f    if( robust_flo
14a40 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
14a50 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20  K_UN) ){.#ifdef 
14a60 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
14a70 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
14a80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14a90 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  E_OK;.#endif /* 
14aa0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
14ab0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
14ac0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
14ad0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
14ae0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
14af0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14b00 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
14b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14b20 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
14b30 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
14b40 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
14b50 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
14b60 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73 73 65  le *id) {.  asse
14b70 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 66  rt( id!=0 );.  f
14b80 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
14b90 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72  O_LOCK);.  retur
14ba0 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
14bb0 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  id);.}..#endif /
14bc0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
14bd0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
14be0 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a   !OS_VXWORK */..
14bf0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14c00 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
14c10 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65  flock lock imple
14c20 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
14c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
14c90 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ce0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
14cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
14d00 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20  Named Semaphore 
14d10 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
14d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d30 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d  .**.** Named sem
14d40 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
14d50 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
14d60 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a   on VxWorks..**.
14d70 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
14d80 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
14d90 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20  -lock and flock 
14da0 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c  in that it reall
14db0 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72  y only.** suppor
14dc0 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ts EXCLUSIVE loc
14dd0 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69  king.  Only a si
14de0 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
14df0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a   read or write.*
14e00 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
14e10 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20  ile at a time.  
14e20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74  This reduces pot
14e30 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e  ential concurren
14e40 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73  cy, but.** makes
14e50 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   the lock implem
14e60 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61  entation much ea
14e70 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f  sier..*/.#if OS_
14e80 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54  VXWORKS../*.** T
14e90 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
14ea0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
14eb0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
14ec0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
14ed0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
14ee0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
14ef0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
14f00 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
14f10 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
14f20 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
14f30 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
14f40 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
14f50 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
14f60 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
14f70 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
14f80 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
14f90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
14fa0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
14fb0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
14fc0 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72  t semXCheckReser
14fd0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
14fe0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
14ff0 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
15000 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15010 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
15020 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
15030 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
15040 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
15050 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
15060 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
15070 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
15080 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
15090 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
150a0 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
150b0 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
150c0 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
150d0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
150e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
150f0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
15100 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
15110 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
15120 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
15130 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
15140 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
15150 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
15160 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20      sem_t *pSem 
15170 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
15180 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20  >pSem;..    if( 
15190 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
151a0 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
151b0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
151c0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
151d0 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
151e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
151f0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
15200 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
15210 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
15220 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
15230 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
15240 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
15250 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20  Errno);.      } 
15260 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f  else {.        /
15270 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68  * someone else h
15280 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e  as the lock when
15290 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f   we are in NO_LO
152a0 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  CK */.        re
152b0 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d  served = (pFile-
152c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41  >eFileLock < SHA
152d0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
152e0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
152f0 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20      /* we could 
15300 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61  have it if we wa
15310 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73  nt it */.      s
15320 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20  em_post(pSem);. 
15330 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
15340 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
15350 4b 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29  K %d %d %d (sem)
15360 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
15370 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
15380 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
15390 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
153a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
153b0 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
153c0 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
153d0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
153e0 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
153f0 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
15400 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
15410 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
15420 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
15430 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
15440 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
15450 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
15460 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
15470 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
15480 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
15490 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
154a0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
154b0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
154c0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
154d0 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
154e0 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
154f0 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
15500 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
15510 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
15520 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
15530 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
15540 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
15550 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
15560 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
15570 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
15580 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
15590 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
155a0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
155b0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
155c0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
155d0 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
155e0 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
155f0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
15600 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
15610 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
15620 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
15630 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
15640 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
15650 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
15660 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20  Semaphore locks 
15670 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
15680 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
15690 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
156a0 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
156b0 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
156c0 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
156d0 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
156e0 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
156f0 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
15700 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
15710 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
15720 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
15730 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
15740 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
15750 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15760 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
15770 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
15780 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
15790 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
157a0 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
157b0 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
157c0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c  static int semXL
157d0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
157e0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
157f0 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
15800 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15810 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
15820 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
15830 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
15840 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15850 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
15860 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
15870 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
15880 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
15890 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
158a0 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
158b0 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
158c0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
158d0 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
158e0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
158f0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
15900 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15910 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
15920 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
15930 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
15940 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
15950 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
15960 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
15970 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
15980 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
15990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
159a0 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
159b0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
159c0 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
159d0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
159e0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
159f0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
15a00 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
15a10 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
15a20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15a30 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
15a40 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
15a50 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
15a60 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
15a70 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
15a80 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
15a90 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
15aa0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
15ab0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
15ac0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
15ad0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
15ae0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
15af0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
15b00 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
15b10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
15b20 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
15b30 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b  c int semXUnlock
15b40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15b50 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
15b60 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
15b70 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
15b80 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  e*)id;.  sem_t *
15b90 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
15ba0 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61  node->pSem;..  a
15bb0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
15bc0 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29    assert( pSem )
15bd0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
15be0 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
15bf0 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c  %d pid=%d (sem)\
15c00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
15c10 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
15c20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15c30 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
15c40 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
15c50 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
15c60 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
15c70 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
15c80 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
15c90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
15ca0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
15cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15cc0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
15cd0 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
15ce0 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
15cf0 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
15d00 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
15d10 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
15d20 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
15d30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15d40 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
15d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15d60 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
15d70 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b  o, really unlock
15d80 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f  . */.  if ( sem_
15d90 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  post(pSem)==-1 )
15da0 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74   {.    int rc, t
15db0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
15dc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
15dd0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
15de0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
15df0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
15e00 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15e10 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
15e20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
15e30 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
15e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
15e50 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
15e60 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
15e70 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75   NO_LOCK;.  retu
15e80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15e90 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20  ./*. ** Close a 
15ea0 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  file.. */.static
15eb0 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73   int semXClose(s
15ec0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
15ed0 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
15ee0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
15ef0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15f00 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f  id;.    semXUnlo
15f10 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
15f20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
15f30 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  le );.    unixEn
15f40 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
15f50 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
15f60 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69  (pFile);.    uni
15f70 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
15f80 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65     closeUnixFile
15f90 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
15fa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15fb0 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
15fc0 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e  WORKS */./*.** N
15fd0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
15fe0 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
15ff0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f  vailable on VxWo
16000 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  rks..**.********
16010 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
16020 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
16030 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  re lock implemen
16040 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
16050 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
16060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
160a0 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
160b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
160c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
160d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
160e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
160f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
16100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16110 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20  ***** Begin AFP 
16120 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
16130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16140 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
16150 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65  AFP is the Apple
16160 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c   Filing Protocol
16170 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77  .  AFP is a netw
16180 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66  ork filesystem f
16190 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65  ound.** on Apple
161a0 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75   Macintosh compu
161b0 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20  ters - both OS9 
161c0 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54  and OSX..**.** T
161d0 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65  hird-party imple
161e0 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46  mentations of AF
161f0 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  P are available.
16200 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20    But this code 
16210 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72  here.** only wor
16220 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23  ks on OSX..*/..#
16230 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
16240 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
16250 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
16260 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  TYLE./*.** The a
16270 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
16280 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
16290 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b  ins all afp lock
162a0 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
162b0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
162c0 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
162d0 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ext afpLockingCo
162e0 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66  ntext;.struct af
162f0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16300 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  {.  int reserved
16310 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
16320 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
16330 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
16340 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a  he open file */.
16350 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
16360 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
16370 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
16380 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
16390 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
163a0 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
163b0 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
163c0 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
163d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
163e0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
163f0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
16400 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
16410 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
16420 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
16430 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
16440 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
16450 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
16460 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
16470 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
16480 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
16490 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
164a0 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
164b0 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
164c0 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
164d0 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164f0 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
16500 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
16510 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
16520 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
16530 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
16540 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27  L        _IOWR('
16550 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
16560 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
16570 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
16580 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65  a utility for se
16590 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e  tting or clearin
165a0 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f  g a bit-range lo
165b0 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20  ck on an.** AFP 
165c0 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a  filesystem..** .
165d0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
165e0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  _OK on success, 
165f0 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66  SQLITE_BUSY on f
16600 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
16610 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b  c int afpSetLock
16620 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
16630 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  path,           
16640 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
16650 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63  e file to be loc
16660 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20  ked or unlocked 
16670 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
16680 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
16690 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
166a0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70   descriptor on p
166b0 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ath */.  unsigne
166c0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
166d0 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  et,     /* First
166e0 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
166f0 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
16700 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
16710 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  h,     /* Number
16720 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
16730 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f  k */.  int setLo
16740 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  ckFlag          
16750 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
16760 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73   set lock.  Fals
16770 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20  e to clear lock 
16780 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42  */.){.  struct B
16790 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20  yteRangeLockPB2 
167a0 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20  pb;.  int err;. 
167b0 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61   .  pb.unLockFla
167c0 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  g = setLockFlag 
167d0 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74  ? 0 : 1;.  pb.st
167e0 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a  artEndFlag = 0;.
167f0 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66    pb.offset = of
16800 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74  fset;.  pb.lengt
16810 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70  h = length; .  p
16820 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  b.fd = pFile->h;
16830 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22  .  .  OSTRACE(("
16840 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20  AFPSETLOCK [%s] 
16850 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67  for %d%s in rang
16860 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20  e %llx:%llx\n", 
16870 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61  .    (setLockFla
16880 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70  g?"ON":"OFF"), p
16890 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d  File->h, (pb.fd=
168a0 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d  =-1?"[testval-1]
168b0 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65  ":""),.    offse
168c0 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65  t, length));.  e
168d0 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c  rr = fsctl(path,
168e0 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
168f0 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20  ock2FSCTL, &pb, 
16900 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d  0);.  if ( err==
16910 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  -1 ) {.    int r
16920 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  c;.    int tErrn
16930 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f  o = errno;.    O
16940 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
16950 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73  OCK failed to fs
16960 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73  ctl() '%s' %d %s
16970 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16980 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20    path, tErrno, 
16990 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29  strerror(tErrno)
169a0 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
169b0 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
169c0 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20  K_ERRORS.    rc 
169d0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23  = SQLITE_BUSY;.#
169e0 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71  else.    rc = sq
169f0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
16a00 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a  ixError(tErrno,.
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20      setLockFlag 
16a30 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  ? SQLITE_IOERR_L
16a40 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  OCK : SQLITE_IOE
16a50 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64  RR_UNLOCK);.#end
16a60 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
16a70 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
16a80 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ORS */.    if( I
16a90 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
16aa0 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
16ab0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
16ac0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
16ad0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16ae0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
16af0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16b00 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
16b10 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
16b20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
16b30 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
16b40 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
16b50 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
16b60 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
16b70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
16b80 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
16b90 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
16ba0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
16bb0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
16bc0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
16bd0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
16be0 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
16bf0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
16c00 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
16c10 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
16c20 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
16c30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
16c40 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
16c50 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
16c60 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
16c70 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
16c80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
16c90 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
16ca0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16cb0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
16cc0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
16cd0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a  ntext *context;.
16ce0 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
16cf0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
16d00 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
16d10 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
16d20 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
16d30 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20  le );.  context 
16d40 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
16d50 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
16d60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
16d70 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65   if( context->re
16d80 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70  served ){.    *p
16d90 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  ResOut = 1;.    
16da0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16db0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
16dc0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c  mutex_enter(pFil
16dd0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  e->pInode->pLock
16de0 4d 75 74 65 78 29 3b 0a 20 20 2f 2a 20 43 68 65  Mutex);.  /* Che
16df0 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
16e00 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
16e10 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
16e20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
16e30 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
16e40 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
16e50 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
16e60 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
16e70 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
16e80 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
16e90 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
16ea0 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
16eb0 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
16ec0 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
16ed0 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
16ee0 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
16ef0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16f00 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
16f10 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
16f20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
16f30 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  K==lrc ){.      
16f40 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64  /* if we succeed
16f50 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65  ed in taking the
16f60 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20   reserved lock, 
16f70 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73  unlock it to res
16f80 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  tore.      ** th
16f90 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  e original state
16fa0 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
16fb0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16fc0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16fd0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
16fe0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65  , 1, 0);.    } e
16ff0 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
17000 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
17010 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
17020 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
17030 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
17040 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
17050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17060 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
17070 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  c) ){.      rc=l
17080 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
17090 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
170a0 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d 3e 70 49  _leave(pFile->pI
170b0 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
170c0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
170d0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
170e0 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d %d (afp)\n", p
170f0 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
17100 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70  erved));.  .  *p
17110 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
17120 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
17130 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
17140 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
17150 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
17160 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
17170 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
17180 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
17190 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
171a0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
171b0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
171c0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
171d0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
171e0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
171f0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
17200 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
17210 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
17220 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
17230 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
17240 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
17250 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
17260 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
17270 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
17280 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
17290 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
172a0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
172b0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
172c0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
172d0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
172e0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
172f0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
17300 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
17310 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
17320 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
17330 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
17340 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
17350 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
17360 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
17370 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
17380 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
17390 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
173a0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
173b0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
173c0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
173d0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
173e0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
173f0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
17400 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
17410 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
17420 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
17430 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
17440 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
17450 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
17460 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65  t afpLock(sqlite
17470 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
17480 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  eFileLock){.  in
17490 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
174a0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
174b0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
174c0 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
174d0 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
174e0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
174f0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
17500 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
17510 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
17520 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
17530 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61  gContext;.  .  a
17540 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
17550 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
17560 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
17570 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
17580 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
17590 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
175a0 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
175b0 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ck), azFileLock(
175c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
175d0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  ),.           az
175e0 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d  FileLock(pInode-
175f0 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e  >eFileLock), pIn
17600 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f  ode->nShared , o
17610 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20  sGetpid(0)));.. 
17620 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
17630 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
17640 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
17650 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
17660 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
17670 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
17680 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
17690 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  afp_end_lock: ex
176a0 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
176b0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
176c0 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
176d0 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
176e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
176f0 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
17700 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
17710 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
17720 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
17730 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  ) (afp)\n", pFil
17740 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
17750 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
17760 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
17770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17780 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
17790 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
177a0 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
177b0 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ect.  **  (1) We
177c0 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
177d0 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
177e0 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
177f0 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
17800 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
17810 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
17820 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
17830 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
17840 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
17850 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
17860 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
17870 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
17880 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17890 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
178a0 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
178b0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
178c0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
178d0 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
178e0 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
178f0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
17900 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
17910 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
17920 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
17930 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73   );.  .  /* This
17940 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
17950 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
17960 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
17970 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
17980 20 20 2a 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20    */.  pInode = 
17990 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
179a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
179b0 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  nter(pInode->pLo
179c0 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ckMutex);..  /* 
179d0 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
179e0 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
179f0 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
17a00 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
17a10 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
17a20 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
17a30 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
17a40 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
17a50 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
17a60 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
17a70 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
17a80 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64  & .       (pInod
17a90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
17aa0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
17ab0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
17ac0 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20  OCK)).     ){.  
17ad0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17ae0 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  SY;.    goto afp
17af0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
17b00 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52   .  /* If a SHAR
17b10 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
17b20 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
17b30 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
17b40 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
17b50 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
17b60 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
17b70 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
17b80 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
17b90 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
17ba0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
17bb0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
17bc0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
17bd0 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e   .     (pInode->
17be0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
17bf0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
17c00 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
17c10 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
17c20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
17c30 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17c40 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
17c50 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17c60 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
17c70 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
17c80 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
17c90 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
17ca0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
17cb0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17cc0 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
17cd0 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
17ce0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
17cf0 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
17d00 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
17d10 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
17d20 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
17d30 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
17d40 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
17d50 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
17d60 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
17d70 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
17d80 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
17d90 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
17da0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
17db0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
17dc0 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
17dd0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
17de0 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
17df0 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
17e00 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
17e10 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
17e20 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
17e30 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17e40 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
17e50 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
17e60 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
17e70 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
17e80 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
17e90 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
17ea0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
17eb0 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
17ec0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
17ed0 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
17ee0 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
17ef0 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
17f00 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
17f10 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
17f20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
17f30 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
17f40 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
17f50 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45  rc1, lrc2, lrc1E
17f60 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f  rrno = 0;.    lo
17f70 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20  ng lk, mask;.   
17f80 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49   .    assert( pI
17f90 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
17fa0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17fb0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17fc0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
17fd0 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a  .    mask = (siz
17fe0 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20  eof(long)==8) ? 
17ff0 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20  LARGEST_INT64 : 
18000 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20  0x7fffffff;.    
18010 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
18020 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f  ead-lock SHARED_
18030 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  LOCK */.    /* n
18040 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
18050 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
18060 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
18070 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
18080 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
18090 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64  om(); .    pInod
180a0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20  e->sharedByte = 
180b0 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41  (lk & mask)%(SHA
180c0 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
180d0 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74     lrc1 = afpSet
180e0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
180f0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
18100 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
18110 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
18120 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  redByte, 1, 1);.
18130 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
18140 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20  ERROR(lrc1) ){. 
18150 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d       lrc1Errno =
18160 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
18170 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  o;.    }.    /* 
18180 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
18190 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
181a0 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66  */.    lrc2 = af
181b0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
181c0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
181d0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
181e0 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  , 0);.    .    i
181f0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
18200 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20  (lrc1) ) {.     
18210 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
18220 70 46 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f  pFile, lrc1Errno
18230 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  );.      rc = lr
18240 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c1;.      goto a
18250 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
18260 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c   } else if( IS_L
18270 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20  OCK_ERROR(lrc2) 
18280 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  ){.      rc = lr
18290 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c2;.      goto a
182a0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
182b0 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31   } else if( lrc1
182c0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20   != SQLITE_OK ) 
182d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
182e0 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  1;.    } else {.
182f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
18300 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
18310 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
18320 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
18330 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
18340 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
18350 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
18360 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
18370 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
18380 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
18390 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
183a0 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
183b0 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
183c0 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
183d0 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  s.     ** same p
183e0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
183f0 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
18400 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
18410 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
18420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
18430 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
18440 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
18450 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
18460 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
18470 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
18480 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
18490 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
184a0 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
184b0 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
184c0 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
184d0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
184e0 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
184f0 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20  eLock );.    if 
18500 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45  (eFileLock >= RE
18510 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
18520 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18530 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
18540 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
18550 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
18560 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
18570 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
18580 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
18590 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
185a0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
185b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69  ;.      if( !fai
185c0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63  led ){.        c
185d0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
185e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
185f0 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69    }.    if (!fai
18600 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  led && eFileLock
18610 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   == EXCLUSIVE_LO
18620 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41  CK) {.      /* A
18630 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
18640 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  IVE lock */.    
18650 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65      .      /* Re
18660 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20  move the shared 
18670 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69  lock before tryi
18680 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77  ng the range.  w
18690 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20  e'll need to .  
186a0 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69      ** reestabli
186b0 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
186c0 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67  ck if we can't g
186d0 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63  et the  afpUnloc
186e0 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  k.      */.     
186f0 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20   if( !(failed = 
18700 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18710 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18720 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  e, SHARED_FIRST 
18730 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
18740 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64             pInod
18750 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
18760 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
18770 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
18780 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
18790 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
187a0 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
187b0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
187c0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
187d0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
187e0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
187f0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
18800 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18820 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
18830 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
18840 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
18850 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
18860 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
18870 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18890 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
188a0 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65   + pInode->share
188b0 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b  dByte, 1, 1)) ){
188c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
188d0 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20  n't reestablish 
188e0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  the shared lock.
188f0 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64    Sqlite can't d
18900 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20  eal, this is.   
18910 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74         ** a crit
18920 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20  ical I/O error. 
18930 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
18940 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69        rc = ((fai
18950 6c 65 64 20 26 20 30 78 66 66 29 20 3d 3d 20 53  led & 0xff) == S
18960 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66  QLITE_IOERR) ? f
18970 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20  ailed2 : .      
18980 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18990 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
189a0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
189b0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  nd_lock;.       
189c0 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   } .      }else{
189d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61  .        rc = fa
189e0 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20  iled; .      }. 
189f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69     }.    if( fai
18a00 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  led ){.      rc 
18a10 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  = failed;.    }.
18a20 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
18a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18a40 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
18a50 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
18a60 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
18a70 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
18a80 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
18a90 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
18aa0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
18ab0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18ac0 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
18ad0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
18ae0 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
18af0 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66  _LOCK;.  }.  .af
18b00 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71  p_end_lock:.  sq
18b10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
18b20 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  e(pInode->pLockM
18b30 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
18b40 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
18b50 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %s (afp)\n", pF
18b60 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
18b70 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
18b80 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
18b90 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
18ba0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
18bb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18bc0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
18bd0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
18be0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
18bf0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
18c00 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
18c10 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
18c20 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
18c30 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
18c40 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
18c50 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
18c60 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
18c70 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
18c80 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
18c90 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
18ca0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18cb0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
18cc0 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28  c int afpUnlock(
18cd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18ce0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
18cf0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
18d00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
18d10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
18d20 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
18d30 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
18d40 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
18d50 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
18d60 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
18d70 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
18d80 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
18d90 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65  .  int skipShare
18da0 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
18db0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
18dc0 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65  h = pFile->h;.#e
18dd0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
18de0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
18df0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
18e00 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
18e10 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
18e20 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
18e30 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
18e40 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
18e50 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
18e60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
18e70 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
18e80 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ared,.          
18e90 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
18ea0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
18eb0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
18ec0 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
18ed0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
18ee0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
18ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18f00 20 20 7d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70    }.  pInode = p
18f10 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
18f20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
18f30 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ter(pInode->pLoc
18f40 6b 4d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  kMutex);.  asser
18f50 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
18f60 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
18f70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
18f80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
18f90 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
18fa0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
18fb0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
18fc0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
18fd0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
18fe0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18ff0 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
19000 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19010 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
19020 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
19030 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
19040 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
19050 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
19060 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
19070 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
19080 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
19090 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
190a0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
190b0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
190c0 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
190d0 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
190e0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
190f0 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
19100 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
19110 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
19120 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
19130 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
19140 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
19150 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
19160 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
19170 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
19180 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
19190 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
191a0 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
191b0 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
191c0 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
191d0 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
191e0 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
191f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
19200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
19210 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  ert( pFile->inNo
19220 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20  rmalWrite==0.   
19230 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
19240 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
19250 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
19260 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
19270 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  ==1 );.    pFile
19280 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
19290 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
192a0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
192b0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
192c0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
192d0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
192e0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
192f0 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
19300 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
19310 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  SIZE, 0);.      
19320 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19330 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
19340 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
19350 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
19360 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
19370 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
19380 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
19390 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
193a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
193b0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
193c0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
193d0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
193e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
193f0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
19400 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
19410 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
19420 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20   1, 1);.      } 
19430 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
19440 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  kipShared = 1;. 
19450 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19460 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19470 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
19480 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
19490 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
194a0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
194b0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
194c0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
194d0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
194e0 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
194f0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
19500 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53  ->eFileLock>=RES
19510 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f  ERVED_LOCK && co
19520 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
19530 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
19540 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
19550 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
19560 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
19570 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
19580 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20   !rc ){ .       
19590 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
195a0 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d  ed = 0; .      }
195b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
195c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
195d0 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
195e0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
195f0 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a  e->nShared>1)){.
19600 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
19610 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
19620 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
19630 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19640 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63  E_OK && eFileLoc
19650 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20  k==NO_LOCK ){.. 
19660 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
19670 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
19680 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
19690 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
196a0 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
196b0 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
196c0 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
196d0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
196e0 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
196f0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
19700 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
19710 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
19720 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
19730 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
19740 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
19750 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
19760 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
19770 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
19780 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  {.      Simulate
19790 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
197a0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
197b0 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
197c0 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
197d0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
197e0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69  ;.      if( !ski
197f0 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20  pShared ){.     
19800 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
19810 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
19820 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
19830 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29  dLockByte, 1, 0)
19840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19850 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
19860 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
19870 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
19880 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
19890 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
198a0 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
198b0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
198c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
198d0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
198e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
198f0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
19900 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
19910 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
19920 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50  {.        closeP
19930 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
19940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19950 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33    }.  .  sqlite3
19960 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49 6e  _mutex_leave(pIn
19970 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29  ode->pLockMutex)
19980 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19990 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
199a0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
199b0 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
199c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
199d0 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e  e a file & clean
199e0 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20  up AFP specific 
199f0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
19a00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
19a10 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  fpClose(sqlite3_
19a20 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
19a30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19a40 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
19a50 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
19a60 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69  )id;.  assert( i
19a70 64 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c  d!=0 );.  afpUnl
19a80 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
19a90 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
19aa0 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ex();.  if( pFil
19ab0 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69  e->pInode && pFi
19ac0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
19ad0 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
19ae0 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
19af0 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
19b00 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
19b10 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
19b20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
19b30 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
19b40 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
19b50 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
19b60 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
19b70 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
19b80 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  ode->aPending.  
19b90 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
19ba0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
19bb0 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  when.    ** the 
19bc0 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
19bd0 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
19be0 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
19bf0 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ile);.  }.  rele
19c00 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
19c10 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  le);.  sqlite3_f
19c20 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ree(pFile->locki
19c30 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63  ngContext);.  rc
19c40 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
19c50 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  (id);.  unixLeav
19c60 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
19c70 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
19c80 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
19c90 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
19ca0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
19cb0 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
19cc0 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
19cd0 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
19ce0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
19cf0 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
19d00 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
19d10 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
19d20 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
19d30 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
19d40 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
19d50 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  s available.  If
19d60 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69   you don't compi
19d70 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68  le for a mac, th
19d80 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70  en the "unix-afp
19d90 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20  ".** VFS is not 
19da0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
19db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19dc0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41  *** End of the A
19dd0 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
19de0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
19df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
19e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
19ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
19ec0 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   NFS Locking ***
19ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
19ef0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
19f00 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
19f10 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
19f20 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77  STYLE./*. ** Low
19f30 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
19f40 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
19f50 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
19f60 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
19f70 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20  leLock. ** must 
19f80 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
19f90 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
19fa0 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65  .. **. ** If the
19fb0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
19fc0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
19fd0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
19fe0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a   at or below. **
19ff0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
1a000 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
1a010 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1a020 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69  no-op.. */.stati
1a030 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28  c int nfsUnlock(
1a040 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a050 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
1a060 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  {.  return posix
1a070 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
1a080 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e  Lock, 1);.}..#en
1a090 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
1a0a0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
1a0b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1a0c0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
1a0d0 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
1a0e0 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   is the NFS lock
1a0f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
1a100 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
1a110 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
1a120 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
1a130 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
1a140 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
1a150 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
1a160 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
1a170 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   .**.***********
1a180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
1a190 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  f the NFS lock i
1a1a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
1a1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1c0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1a1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a210 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
1a220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a260 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
1a270 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69  ****** Non-locki
1a280 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ng sqlite3_file 
1a290 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
1a2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a2b0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
1a2c0 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f  next division co
1a2d0 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74  ntains implement
1a2e0 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d  ations for all m
1a2f0 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a  ethods of the .*
1a300 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f  * sqlite3_file o
1a310 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e  bject other than
1a320 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   the locking met
1a330 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69  hods.  The locki
1a340 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65  ng.** methods we
1a350 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69  re defined in di
1a360 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f  visions above (o
1a370 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ne locking metho
1a380 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f  d per.** divisio
1a390 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f  n).  Those metho
1a3a0 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  ds that are comm
1a3b0 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
1a3c0 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67  g modes.** are g
1a3d0 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69  ather together i
1a3e0 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f  nto this divisio
1a3f0 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  n..*/../*.** See
1a400 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
1a410 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1a420 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74  cond argument, t
1a430 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a  hen read cnt .**
1a440 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
1a450 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
1a460 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
1a470 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ually read..**.*
1a480 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65  * NB:  If you de
1a490 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f  fine USE_PREAD o
1a4a0 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74  r USE_PREAD64, t
1a4b0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73  hen it might als
1a4c0 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72  o.** be necessar
1a4d0 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  y to define _XOP
1a4e0 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20  EN_SOURCE to be 
1a4f0 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65  500.  This varie
1a500 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79  s from.** one sy
1a510 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e  stem to another.
1a520 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64    Since SQLite d
1a530 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55  oes not define U
1a540 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61  SE_PREAD.** in a
1a550 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75  ny form by defau
1a560 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20  lt, we will not 
1a570 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e  attempt to defin
1a580 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e  e _XOPEN_SOURCE.
1a590 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20  .** See tickets 
1a5a0 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e  #2741 and #2681.
1a5b0 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
1a5c0 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
1a5d0 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
1a5e0 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61  iled read the la
1a5f0 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
1a600 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
1a610 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1a620 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52  tic int seekAndR
1a630 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ead(unixFile *id
1a640 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1a650 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42  offset, void *pB
1a660 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
1a670 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70  int got;.  int p
1a680 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21  rior = 0;.#if (!
1a690 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1a6a0 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  D) && !defined(U
1a6b0 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69  SE_PREAD64)).  i
1a6c0 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65  64 newOffset;.#e
1a6d0 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41  ndif.  TIMER_STA
1a6e0 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e  RT;.  assert( cn
1a6f0 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29  t==(cnt&0x1ffff)
1a700 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1a710 2d 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23  ->h>2 );.  do{.#
1a720 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1a730 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20  READ).    got = 
1a740 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70  osPread(id->h, p
1a750 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
1a760 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1a770 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
1a780 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1a790 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
1a7a0 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
1a7b0 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
1a7c0 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
1a7d0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a7e0 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
1a7f0 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73  else.    newOffs
1a800 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
1a810 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
1a820 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
1a830 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66  eIOError( newOff
1a840 73 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20  set = -1 );.    
1a850 69 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20  if( newOffset<0 
1a860 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
1a870 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
1a880 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20  e*)id, errno);. 
1a890 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1a8a0 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20      }.    got = 
1a8b0 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  osRead(id->h, pB
1a8c0 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
1a8d0 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e  .    if( got==cn
1a8e0 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  t ) break;.    i
1a8f0 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
1a900 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e    if( errno==EIN
1a910 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63  TR ){ got = 1; c
1a920 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20  ontinue; }.     
1a930 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20   prior = 0;.    
1a940 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1a950 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20  ((unixFile*)id, 
1a960 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62   errno);.      b
1a970 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  reak;.    }else 
1a980 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20  if( got>0 ){.   
1a990 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20     cnt -= got;. 
1a9a0 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67       offset += g
1a9b0 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20  ot;.      prior 
1a9c0 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42  += got;.      pB
1a9d0 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74  uf = (void*)(got
1a9e0 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b   + (char*)pBuf);
1a9f0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1aa00 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45   got>0 );.  TIME
1aa10 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
1aa20 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20  (("READ    %-3d 
1aa30 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1aa40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
1aa50 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c  d->h, got+prior,
1aa60 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54   offset-prior, T
1aa70 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
1aa80 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69    return got+pri
1aa90 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  or;.}../*.** Rea
1aaa0 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
1aab0 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
1aac0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1aad0 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
1aae0 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
1aaf0 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
1ab00 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
1ab10 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1ab20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
1ab30 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20   int unixRead(. 
1ab40 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
1ab50 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  d, .  void *pBuf
1ab60 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
1ab70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
1ab80 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69  fset.){.  unixFi
1ab90 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1aba0 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
1abb0 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28  t got;.  assert(
1abc0 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28   id );.  assert(
1abd0 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20   offset>=0 );.  
1abe0 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
1abf0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1ac00 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
1ac10 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
1ac20 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
1ac30 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
1ac40 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
1ac50 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
1ac60 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
1ac70 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
1ac80 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
1ac90 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
1aca0 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
1acb0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ed==0.       || 
1acc0 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f  offset>=PENDING_
1acd0 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20  BYTE+512.       
1ace0 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50  || offset+amt<=P
1acf0 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29  ENDING_BYTE .  )
1ad00 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ;.#endif..#if SQ
1ad10 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1ad20 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
1ad30 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
1ad40 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74  his read request
1ad50 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1ad60 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1ad70 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1ad80 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1ad90 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1ada0 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1adb0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1adc0 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1add0 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1ade0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1adf0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
1ae00 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1ae10 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1ae20 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  t], amt);.      
1ae30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ae40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ae50 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1ae60 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1ae70 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1ae80 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
1ae90 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
1aea0 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
1aeb0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1aec0 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1aed0 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1aee0 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1aef0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1af00 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1af10 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20  }.#endif..  got 
1af20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
1af30 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
1af40 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67  f, amt);.  if( g
1af50 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72  ot==amt ){.    r
1af60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1af70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74  .  }else if( got
1af80 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73  <0 ){.    /* las
1af90 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
1afa0 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
1afb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1afc0 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  OERR_READ;.  }el
1afd0 73 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73  se{.    storeLas
1afe0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29  tErrno(pFile, 0)
1aff0 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73  ;   /* not a sys
1b000 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
1b010 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
1b020 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
1b030 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
1b040 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
1b050 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
1b060 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
1b070 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1b080 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1b090 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
1b0a0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1b0b0 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73  eek the file-des
1b0c0 63 72 69 70 74 6f 72 20 70 61 73 73 65 64 20 61  criptor passed a
1b0d0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1b0e0 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c  ment to.** absol
1b0f0 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c  ute offset iOff,
1b100 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   then attempt to
1b110 20 77 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   write nBuf byte
1b120 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a  s of data from.*
1b130 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66  * pBuf to it. If
1b140 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1b150 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20  , return -1 and 
1b160 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74  set *piErrno. Ot
1b170 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74  herwise, .** ret
1b180 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e  urn the actual n
1b190 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1b1a0 72 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61  ritten (which ma
1b1b0 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a  y be less than.*
1b1c0 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74  * nBuf)..*/.stat
1b1d0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
1b1e0 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c  iteFd(.  int fd,
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b200 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1b210 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77   descriptor to w
1b220 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34  rite to */.  i64
1b230 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20   iOff,          
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b250 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62  File offset to b
1b260 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20  egin writing at 
1b270 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1b280 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
1b290 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74       /* Copy dat
1b2a0 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66  a from this buff
1b2b0 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a  er to the file *
1b2c0 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20  /.  int nBuf,   
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2e0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
1b2f0 75 66 66 65 72 20 70 42 75 66 20 69 6e 20 62 79  uffer pBuf in by
1b300 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  tes */.  int *pi
1b310 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20  Errno           
1b320 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1b330 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66   Error number if
1b340 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f   error occurs */
1b350 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
1b360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b370 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
1b380 65 74 75 72 6e 65 64 20 62 79 20 73 79 73 74 65  eturned by syste
1b390 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73  m call */..  ass
1b3a0 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66  ert( nBuf==(nBuf
1b3b0 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61  &0x1ffff) );.  a
1b3c0 73 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20  ssert( fd>2 );. 
1b3d0 20 61 73 73 65 72 74 28 20 70 69 45 72 72 6e 6f   assert( piErrno
1b3e0 21 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d  !=0 );.  nBuf &=
1b3f0 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45   0x1ffff;.  TIME
1b400 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65  R_START;..#if de
1b410 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
1b420 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74  .  do{ rc = (int
1b430 29 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70 42  )osPwrite(fd, pB
1b440 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1b450 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1b460 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1b470 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
1b480 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f  SE_PREAD64).  do
1b490 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77  { rc = (int)osPw
1b4a0 72 69 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c  rite64(fd, pBuf,
1b4b0 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68   nBuf, iOff);}wh
1b4c0 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1b4d0 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73  no==EINTR);.#els
1b4e0 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20  e.  do{.    i64 
1b4f0 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64  iSeek = lseek(fd
1b500 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54  , iOff, SEEK_SET
1b510 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1b520 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 20 3d 20  OError( iSeek = 
1b530 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 53  -1 );.    if( iS
1b540 65 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  eek<0 ){.      r
1b550 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72  c = -1;.      br
1b560 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
1b570 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20  c = osWrite(fd, 
1b580 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d  pBuf, nBuf);.  }
1b590 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
1b5a0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
1b5b0 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45  endif..  TIMER_E
1b5c0 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ND;.  OSTRACE(("
1b5d0 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
1b5e0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
1b5f0 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49  fd, rc, iOff, TI
1b600 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a  MER_ELAPSED));..
1b610 20 20 69 66 28 20 72 63 3c 30 20 29 20 2a 70 69    if( rc<0 ) *pi
1b620 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1b630 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1b640 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
1b650 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e  e offset in id->
1b660 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64  offset then read
1b670 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20   cnt bytes into 
1b680 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pBuf..** Return 
1b690 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b6a0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
1b6b0 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f  d.  Update the o
1b6c0 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ffset..**.** To 
1b6d0 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
1b6e0 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
1b6f0 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65  n a failed write
1b700 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
1b710 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
1b720 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1b730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1b740 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
1b750 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66  File *id, i64 of
1b760 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  fset, const void
1b770 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
1b780 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41  {.  return seekA
1b790 6e 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c  ndWriteFd(id->h,
1b7a0 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63   offset, pBuf, c
1b7b0 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72  nt, &id->lastErr
1b7c0 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  no);.}.../*.** W
1b7d0 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
1b7e0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
1b7f0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
1b800 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1b810 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
1b820 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
1b830 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
1b840 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74  tic int unixWrit
1b850 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
1b860 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20  e *id, .  const 
1b870 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
1b880 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
1b890 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a  3_int64 offset .
1b8a0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1b8b0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1b8c0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74  *)id;.  int wrot
1b8d0 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
1b8e0 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28   id );.  assert(
1b8f0 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20   amt>0 );..  /* 
1b900 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
1b910 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
1b920 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
1b930 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
1b940 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
1b950 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
1b960 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
1b970 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
1b980 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
1b990 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
1b9a0 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f   pFile->pPreallo
1b9b0 63 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20  catedUnused==0. 
1b9c0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
1b9d0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
1b9e0 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
1b9f0 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
1ba00 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
1ba10 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1ba20 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77  _DEBUG.  /* If w
1ba30 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
1ba40 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
1ba50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
1ba60 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a  s opposed to.  *
1ba70 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1ba80 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1ba90 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1baa0 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1bab0 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  n a.  ** normal 
1bac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74  database file) t
1bad0 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66  hen record the f
1bae0 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74  act that the dat
1baf0 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63  abase.  ** has c
1bb00 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
1bb10 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1bb20 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c  ter is modified,
1bb30 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a   record that.  *
1bb40 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f  * fact too..  */
1bb50 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e  .  if( pFile->in
1bb60 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20  NormalWrite ){. 
1bb70 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
1bb80 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  te = 1;  /* The 
1bb90 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1bba0 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20  n modified */.  
1bbb0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34    if( offset<=24
1bbc0 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d   && offset+amt>=
1bbd0 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  27 ){.      int 
1bbe0 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f  rc;.      char o
1bbf0 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20  ldCntr[4];.     
1bc00 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1bc10 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1bc20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61   rc = seekAndRea
1bc30 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64  d(pFile, 24, old
1bc40 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cntr, 4);.      
1bc50 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1bc60 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1bc70 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d  if( rc!=4 || mem
1bc80 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28  cmp(oldCntr, &((
1bc90 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f  char*)pBuf)[24-o
1bca0 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b  ffset], 4)!=0 ){
1bcb0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1bcc0 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
1bcd0 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  1;  /* The trans
1bce0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68  action counter h
1bcf0 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  as changed */.  
1bd00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bd10 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1bd20 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f  ned(SQLITE_MMAP_
1bd30 52 45 41 44 57 52 49 54 45 29 20 26 26 20 53 51  READWRITE) && SQ
1bd40 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1bd50 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
1bd60 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
1bd70 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73  his write reques
1bd80 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
1bd90 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
1bda0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1bdb0 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
1bdc0 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
1bdd0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1bde0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1bdf0 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
1be00 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
1be10 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1be20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1be30 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1be40 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
1be50 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  Buf, amt);.     
1be60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1be70 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1be80 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1be90 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1bea0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1beb0 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
1bec0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1bed0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
1bee0 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  f, nCopy);.     
1bef0 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
1bf00 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
1bf10 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
1bf20 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
1bf30 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
1bf40 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77 68   }.#endif. .  wh
1bf50 69 6c 65 28 20 28 77 72 6f 74 65 20 3d 20 73 65  ile( (wrote = se
1bf60 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1bf70 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1bf80 61 6d 74 29 29 3c 61 6d 74 20 26 26 20 77 72 6f  amt))<amt && wro
1bf90 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  te>0 ){.    amt 
1bfa0 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
1bfb0 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
1bfc0 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
1bfd0 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
1bfe0 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
1bff0 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
1c000 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
1c010 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1c020 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
1c030 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69  , amt=1 ));..  i
1c040 66 28 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a  f( amt>wrote ){.
1c050 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
1c060 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  && pFile->lastEr
1c070 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20  rno!=ENOSPC ){. 
1c080 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e       /* lastErrn
1c090 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
1c0a0 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72  Write */.      r
1c0b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1c0c0 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  RR_WRITE;.    }e
1c0d0 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  lse{.      store
1c0e0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1c0f0 20 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79   0); /* not a sy
1c100 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1c110 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c120 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
1c130 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1c140 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
1c150 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
1c160 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1c170 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
1c180 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
1c190 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
1c1a0 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
1c1b0 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
1c1c0 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69  yncs are occurri
1c1d0 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
1c1e0 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
1c1f0 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1c200 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
1c210 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1c220 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1c230 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72  .** We do not tr
1c240 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70  ust systems to p
1c250 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67  rovide a working
1c260 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53   fdatasync().  S
1c270 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72  ome do..** Other
1c280 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20  s do no.  To be 
1c290 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74  safe, we will st
1c2a0 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c  ick with the (sl
1c2b0 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a  ightly slower).*
1c2c0 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f  * fsync(). If yo
1c2d0 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72  u know that your
1c2e0 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70   system does sup
1c2f0 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29  port fdatasync()
1c300 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74   correctly,.** t
1c310 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69  hen simply compi
1c320 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73  le with -Dfdatas
1c330 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72  ync=fdatasync or
1c340 20 2d 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e   -DHAVE_FDATASYN
1c350 43 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  C.*/.#if !define
1c360 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20  d(fdatasync) && 
1c370 21 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a  !HAVE_FDATASYNC.
1c380 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
1c390 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
1c3a0 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
1c3b0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
1c3c0 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
1c3d0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1c3e0 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
1c3f0 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
1c400 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
1c410 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
1c420 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
1c430 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
1c440 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
1c450 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
1c460 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
1c470 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1c480 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
1c490 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1c4a0 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
1c4b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
1c4c0 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
1c4d0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
1c4e0 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
1c4f0 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
1c500 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
1c510 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
1c520 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
1c530 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
1c540 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
1c550 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1c560 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
1c570 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
1c580 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
1c590 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
1c5a0 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
1c5b0 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
1c5c0 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
1c5d0 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
1c5e0 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
1c5f0 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
1c600 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1c610 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
1c620 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
1c630 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1c640 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
1c650 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
1c660 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
1c670 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
1c680 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1c690 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
1c6a0 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1c6b0 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
1c6c0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
1c6d0 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
1c6e0 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
1c6f0 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
1c700 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
1c710 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
1c720 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
1c730 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
1c740 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
1c750 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
1c760 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
1c770 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
1c780 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
1c790 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
1c7a0 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
1c7b0 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
1c7c0 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1c7d0 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
1c7e0 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
1c7f0 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
1c800 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
1c810 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
1c820 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
1c830 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
1c840 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
1c850 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
1c860 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
1c870 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
1c880 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
1c890 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
1c8a0 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
1c8b0 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
1c8c0 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
1c8d0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1c8e0 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
1c8f0 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
1c900 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
1c910 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
1c920 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
1c930 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
1c940 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
1c950 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
1c960 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
1c970 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
1c980 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
1c990 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
1c9a0 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
1c9b0 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
1c9c0 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
1c9d0 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
1c9e0 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
1c9f0 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
1ca00 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1ca10 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
1ca20 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
1ca30 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
1ca40 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
1ca50 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
1ca60 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
1ca70 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
1ca80 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
1ca90 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
1caa0 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
1cab0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
1cac0 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
1cad0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1cae0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1caf0 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
1cb00 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
1cb10 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
1cb20 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1cb30 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
1cb40 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
1cb50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1cb60 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
1cb70 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1cb80 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1cb90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1cba0 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
1cbb0 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
1cbc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
1cbd0 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
1cbe0 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
1cbf0 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
1cc00 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
1cc10 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
1cc20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
1cc30 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
1cc40 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
1cc50 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
1cc60 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
1cc70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1cc80 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
1cc90 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
1cca0 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
1ccb0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1ccc0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
1ccd0 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
1cce0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
1ccf0 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
1cd00 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
1cd10 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 42  a.  ** no-op.  B
1cd20 75 74 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ut go ahead and 
1cd30 63 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20  call fstat() to 
1cd40 76 61 6c 69 64 61 74 65 20 74 68 65 20 66 69 6c  validate the fil
1cd50 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f  e.  ** descripto
1cd60 72 20 61 73 20 77 65 20 6e 65 65 64 20 61 20 6d  r as we need a m
1cd70 65 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f 6b 65  ethod to provoke
1cd80 20 61 20 66 61 69 6c 75 72 65 20 64 75 72 69 6e   a failure durin
1cd90 67 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74 65 20  g.  ** coverate 
1cda0 74 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a 23 69  testing..  */.#i
1cdb0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1cdc0 59 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  YNC.  {.    stru
1cdd0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
1cde0 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64   rc = osFstat(fd
1cdf0 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  , &buf);.  }.#el
1ce00 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1ce10 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
1ce20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46   ){.    rc = osF
1ce30 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46  cntl(fd, F_FULLF
1ce40 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  SYNC, 0);.  }els
1ce50 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
1ce60 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46   }.  /* If the F
1ce70 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c  ULLFSYNC failed,
1ce80 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74   fall back to at
1ce90 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e  tempting an fsyn
1cea0 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f  c()..  ** It sho
1ceb0 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62  uldn't be possib
1cec0 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63  le for fullfsync
1ced0 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   to fail on the 
1cee0 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  local .  ** file
1cef0 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29   system (on OSX)
1cf00 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64  , so failure ind
1cf10 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c  icates that FULL
1cf20 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74  FSYNC.  ** isn't
1cf30 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74   supported for t
1cf40 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  his file system.
1cf50 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20   So, attempt an 
1cf60 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20  fsync .  ** and 
1cf70 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65  (for now) ignore
1cf80 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
1cf90 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66   a superfluous f
1cfa0 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a  cntl call.  .  *
1cfb0 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72  * It'd be better
1cfc0 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66   to detect fullf
1cfd0 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63  sync support onc
1cfe0 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a  e and avoid .  *
1cff0 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c  * the fcntl call
1d000 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63   every time sync
1d010 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f   is called..  */
1d020 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d  .  if( rc ) rc =
1d030 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c   fsync(fd);..#el
1d040 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1d050 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61  LE__).  /* fdata
1d060 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64  sync() on HFS+ d
1d070 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68  oesn't yet flush
1d080 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1d090 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72  f it changed cor
1d0a0 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63  rectly.  ** so c
1d0b0 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61  urrently we defa
1d0c0 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  ult to the macro
1d0d0 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20   that redefines 
1d0e0 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79  fdatasync to fsy
1d0f0 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66  nc.  */.  rc = f
1d100 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20  sync(fd);.#else 
1d110 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e  .  rc = fdatasyn
1d120 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58  c(fd);.#if OS_VX
1d130 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d  WORKS.  if( rc==
1d140 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  -1 && errno==ENO
1d150 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d  TSUP ){.    rc =
1d160 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a   fsync(fd);.  }.
1d170 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
1d180 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  ORKS */.#endif /
1d190 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  * ifdef SQLITE_N
1d1a0 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45  O_SYNC elif HAVE
1d1b0 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20  _FULLFSYNC */.. 
1d1c0 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20   if( OS_VXWORKS 
1d1d0 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20  && rc!= -1 ){.  
1d1e0 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    rc = 0;.  }.  
1d1f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d200 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  .** Open a file 
1d210 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
1d220 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1d230 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c  aining file zFil
1d240 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63  ename..** If suc
1d250 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73  cessful, *pFd is
1d260 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e   set to the open
1d270 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1d280 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  or and.** SQLITE
1d290 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1d2a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d2b0 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49  urs, either SQLI
1d2c0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53  TE_NOMEM.** or S
1d2d0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69  QLITE_CANTOPEN i
1d2e0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1d2f0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pFd is set to an
1d300 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61   undefined.** va
1d310 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  lue..**.** The d
1d320 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
1d330 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64  scriptor is used
1d340 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68   for only one th
1d350 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e  ing - to.** fsyn
1d360 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20  c() a directory 
1d370 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c  to make sure fil
1d380 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64  e creation and d
1d390 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a  eletion events.*
1d3a0 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f  * are flushed to
1d3b0 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79   disk.  Such fsy
1d3c0 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64  ncs are not need
1d3d0 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a  ed on newer.** j
1d3e0 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79  ournaling filesy
1d3f0 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72  stems, but are r
1d400 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72  equired on older
1d410 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
1d420 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d430 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
1d440 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65  en using the xSe
1d450 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61  tSysCall interfa
1d460 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69  ce..** The abili
1d470 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74  ty to override t
1d480 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1d490 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74  added in support
1d4a0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d   of the.** chrom
1d4b0 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70  ium sandbox.  Op
1d4c0 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ening a director
1d4d0 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20  y is a security 
1d4e0 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20  risk (we are.** 
1d4f0 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20  told) so making 
1d500 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  it overrideable 
1d510 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d  allows the chrom
1d520 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a  ium sandbox to.*
1d530 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72  * replace this r
1d540 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61  outine with a ha
1d550 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54  rmless no-op.  T
1d560 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74  o make this rout
1d570 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20  ine.** a no-op, 
1d580 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20  replace it with 
1d590 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75  a stub that retu
1d5a0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  rns SQLITE_OK bu
1d5b0 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64  t leaves.** *pFd
1d5c0 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69   set to a negati
1d5d0 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ve number..**.**
1d5e0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1d5f0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
1d600 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1d610 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
1d620 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
1d630 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
1d640 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
1d650 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
1d660 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
1d670 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
1d680 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
1d690 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
1d6a0 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
1d6b0 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
1d6c0 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
1d6d0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1d6e0 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
1d6f0 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
1d700 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29  ;.  for(ii=(int)
1d710 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
1d720 3b 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e 61  ; ii>0 && zDirna
1d730 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
1d740 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
1d750 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
1d760 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c  i] = '\0';.  }el
1d770 73 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72  se{.    if( zDir
1d780 6e 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a  name[0]!='/' ) z
1d790 44 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27  Dirname[0] = '.'
1d7a0 3b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31  ;.    zDirname[1
1d7b0 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20  ] = 0;.  }.  fd 
1d7c0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44  = robust_open(zD
1d7d0 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
1d7e0 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
1d7f0 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
1d800 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
1d810 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20  DIR %-3d %s\n", 
1d820 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a  fd, zDirname));.
1d830 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b    }.  *pFd = fd;
1d840 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72  .  if( fd>=0 ) r
1d850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d860 0a 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f  .  return unixLo
1d870 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
1d880 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
1d890 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44  enDirectory", zD
1d8a0 69 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  irname);.}../*.*
1d8b0 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
1d8c0 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
1d8d0 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
1d8e0 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
1d8f0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  k..**.** If data
1d900 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74  Only==0 then bot
1d910 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  h the file itsel
1d920 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61  f and its metada
1d930 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65  ta (file.** size
1d940 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65  , access time, e
1d950 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20  tc) are synced. 
1d960 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20   If dataOnly!=0 
1d970 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  then only the.**
1d980 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79   file data is sy
1d990 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65  nced..**.** Unde
1d9a0 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b  r Unix, also mak
1d9b0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
1d9c0 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1d9d0 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  for the file.** 
1d9e0 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
1d9f0 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68   by fsync-ing th
1da00 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
1da10 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69   contains the fi
1da20 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20  le..** If we do 
1da30 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20  not do this and 
1da40 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70  we encounter a p
1da50 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
1da60 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65  e directory.** e
1da70 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
1da80 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65  rnal might not e
1da90 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65  xist after we re
1daa0 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a  boot.  The next.
1dab0 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63  ** SQLite to acc
1dac0 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ess the file wil
1dad0 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20  l not know that 
1dae0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  the journal exis
1daf0 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ts (because.** t
1db00 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
1db10 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1db20 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65  al was never cre
1db30 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72  ated) and the tr
1db40 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c  ansaction.** wil
1db50 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  l not roll back 
1db60 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69  - possibly leadi
1db70 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
1db80 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
1db90 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e  atic int unixSyn
1dba0 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
1dbb0 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
1dbc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
1dbd0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1dbe0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
1dbf0 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d  int isDataOnly =
1dc00 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53   (flags&SQLITE_S
1dc10 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20  YNC_DATAONLY);. 
1dc20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20   int isFullsync 
1dc30 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  = (flags&0x0F)==
1dc40 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1dc50 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
1dc60 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  at one of SQLITE
1dc70 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20  _SYNC_NORMAL or 
1dc80 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20  FULL was passed 
1dc90 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61  */.  assert((fla
1dca0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1dcb0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20  _SYNC_NORMAL.   
1dcc0 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30     || (flags&0x0
1dcd0 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
1dce0 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  FULL.  );..  /* 
1dcf0 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
1dd00 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
1dd10 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1dd20 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
1dd30 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
1dd40 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
1dd50 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
1dd60 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
1dd70 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
1dd80 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
1dd90 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1dda0 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65  _FULL );..  asse
1ddb0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
1ddc0 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20  STRACE(("SYNC   
1ddd0 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
1dde0 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c  >h));.  rc = ful
1ddf0 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68  l_fsync(pFile->h
1de00 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73  , isFullsync, is
1de10 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d  DataOnly);.  Sim
1de20 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
1de30 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  =1 );.  if( rc )
1de40 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
1de50 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
1de60 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75  o);.    return u
1de70 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1de80 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20  TE_IOERR_FSYNC, 
1de90 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46  "full_fsync", pF
1dea0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
1deb0 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e  ..  /* Also fsyn
1dec0 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  c the directory 
1ded0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
1dee0 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59  ile if the DIRSY
1def0 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20  NC flag.  ** is 
1df00 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20  set.  This is a 
1df10 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65  one-time occurre
1df20 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65  nce.  Many syste
1df30 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49  ms (examples: AI
1df40 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62  X).  ** are unab
1df50 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69  le to fsync a di
1df60 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f  rectory, so igno
1df70 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65  re errors on the
1df80 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69   fsync..  */.  i
1df90 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
1dfa0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
1dfb0 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e  IRSYNC ){.    in
1dfc0 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54  t dirfd;.    OST
1dfd0 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25  RACE(("DIRSYNC %
1dfe0 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  s (have_fullfsyn
1dff0 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
1e000 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  )\n", pFile->zPa
1e010 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  th,.            
1e020 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
1e030 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20  isFullsync));.  
1e040 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
1e050 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50  ectory(pFile->zP
1e060 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20  ath, &dirfd);.  
1e070 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e080 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c  _OK ){.      ful
1e090 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30  l_fsync(dirfd, 0
1e0a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  , 0);.      robu
1e0b0 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
1e0c0 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  dirfd, __LINE__)
1e0d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e0e0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1e0f0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
1e100 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1e110 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e120 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1e130 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f  gs &= ~UNIXFILE_
1e140 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72  DIRSYNC;.  }.  r
1e150 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e160 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
1e170 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
1e180 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
1e190 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54  static int unixT
1e1a0 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f  runcate(sqlite3_
1e1b0 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42  file *id, i64 nB
1e1c0 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  yte){.  unixFile
1e1d0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1e1e0 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
1e1f0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  rc;.  assert( pF
1e200 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
1e210 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1e220 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
1e230 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20  UNCATE );..  /* 
1e240 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
1e250 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
1e260 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
1e270 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20   file, truncate 
1e280 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f  the.  ** file so
1e290 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74   that it consist
1e2a0 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  s of an integer 
1e2b0 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73  number of chunks
1e2c0 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20   (i.e. the.  ** 
1e2d0 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65  actual file size
1e2e0 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
1e2f0 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67  tion may be larg
1e300 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
1e310 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29  ested.  ** size)
1e320 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1e330 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
1e340 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
1e350 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
1e360 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
1e370 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
1e380 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
1e390 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f  ..  rc = robust_
1e3a0 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
1e3b0 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  >h, nByte);.  if
1e3c0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72  ( rc ){.    stor
1e3d0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1e3e0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
1e3f0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1e400 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1e410 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1e420 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1e430 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69  th);.  }else{.#i
1e440 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1e450 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  G.    /* If we a
1e460 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
1e470 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
1e480 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
1e490 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a  pposed to.    **
1e4a0 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1e4b0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1e4c0 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1e4d0 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1e4e0 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c   a.    ** normal
1e4f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1e500 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20  and we truncate 
1e510 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
1e520 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20   length,.    ** 
1e530 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79  that effectively
1e540 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
1e550 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68  nge counter.  Th
1e560 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a  is might happen.
1e570 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74      ** when rest
1e580 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  oring a database
1e590 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75   using the backu
1e5a0 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72  p API from a zer
1e5b0 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  o-length.    ** 
1e5c0 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20  source..    */. 
1e5d0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e     if( pFile->in
1e5e0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e  NormalWrite && n
1e5f0 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
1e600 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
1e610 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d  rChng = 1;.    }
1e620 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1e630 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1e640 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  E>0.    /* If th
1e650 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  e file was just 
1e660 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73  truncated to a s
1e670 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  ize smaller than
1e680 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   the currently. 
1e690 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67     ** mapped reg
1e6a0 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20  ion, reduce the 
1e6b0 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e  effective mappin
1e6c0 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20  g size as well. 
1e6d0 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20  SQLite will.    
1e6e0 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e  ** use read() an
1e6f0 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63  d write() to acc
1e700 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20  ess data beyond 
1e710 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20  this point from 
1e720 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f  now on.  .    */
1e730 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70  .    if( nByte<p
1e740 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1e750 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d  {.      pFile->m
1e760 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b  mapSize = nByte;
1e770 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1e780 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e790 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
1e7a0 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
1e7b0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
1e7c0 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
1e7d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1e7e0 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  ixFileSize(sqlit
1e7f0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1e800 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
1e810 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  rc;.  struct sta
1e820 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28  t buf;.  assert(
1e830 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73   id );.  rc = os
1e840 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  Fstat(((unixFile
1e850 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b  *)id)->h, &buf);
1e860 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1e870 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1e880 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc!=0 ){.    s
1e890 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75  toreLastErrno((u
1e8a0 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72  nixFile*)id, err
1e8b0 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  no);.    return 
1e8c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1e8d0 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  AT;.  }.  *pSize
1e8e0 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
1e8f0 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69  .  /* When openi
1e900 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64  ng a zero-size d
1e910 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e  atabase, the fin
1e920 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f  dInodeInfo() pro
1e930 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74  cedure.  ** writ
1e940 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  es a single byte
1e950 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20   into that file 
1e960 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
1e970 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20   around a bug.  
1e980 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d  ** in the OS-X m
1e990 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e  sdos filesystem.
1e9a0 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76    In order to av
1e9b0 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  oid problems wit
1e9c0 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79  h upper.  ** lay
1e9d0 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ers, we need to 
1e9e0 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65  report this file
1e9f0 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76   size as zero ev
1ea00 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a  en though it is.
1ea10 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20    ** really 1.  
1ea20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20   Ticket #3260.. 
1ea30 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65   */.  if( *pSize
1ea40 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30  ==1 ) *pSize = 0
1ea50 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ;...  return SQL
1ea60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
1ea70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1ea80 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1ea90 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1eaa0 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66  ./*.** Handler f
1eab0 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  or proxy-locking
1eac0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65   file-control ve
1ead0 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65  rbs.  Defined be
1eae0 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72  low in the.** pr
1eaf0 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64  oxying locking d
1eb00 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ivision..*/.stat
1eb10 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
1eb20 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1eb30 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29  file*,int,void*)
1eb40 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a  ;.#endif../* .**
1eb50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1eb60 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64  s called to hand
1eb70 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  le the SQLITE_FC
1eb80 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a  NTL_SIZE_HINT .*
1eb90 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f  * file-control o
1eba0 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72  peration.  Enlar
1ebb0 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ge the database 
1ebc0 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a  to nBytes in siz
1ebd0 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70  e.** (rounded up
1ebe0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75   to the next chu
1ebf0 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68  nk-size).  If th
1ec00 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
1ec10 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20  ready.** nBytes 
1ec20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20  or larger, this 
1ec30 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1ec40 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
1ec50 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  t fcntlSizeHint(
1ec60 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
1ec70 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69   i64 nByte){.  i
1ec80 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1ec90 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  k>0 ){.    i64 n
1eca0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1ecb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1ecc0 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1ecd0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
1ece0 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  t buf;          
1ecf0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68      /* Used to h
1ed00 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65  old return value
1ed10 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a  s of fstat() */.
1ed20 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73     .    if( osFs
1ed30 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
1ed40 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  uf) ){.      ret
1ed50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1ed60 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20  _FSTAT;.    }.. 
1ed70 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79     nSize = ((nBy
1ed80 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  te+pFile->szChun
1ed90 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a  k-1) / pFile->sz
1eda0 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
1edb0 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28  szChunk;.    if(
1edc0 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e   nSize>(i64)buf.
1edd0 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20  st_size ){..#if 
1ede0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53  defined(HAVE_POS
1edf0 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26  IX_FALLOCATE) &&
1ee00 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c   HAVE_POSIX_FALL
1ee10 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54  OCATE.      /* T
1ee20 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73  he code below is
1ee30 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65   handling the re
1ee40 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73  turn value of os
1ee50 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20  Fallocate() .   
1ee60 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e     ** correctly.
1ee70 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1ee80 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
1ee90 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f   "returns zero o
1eea0 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20  n success, .    
1eeb0 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72    ** or an error
1eec0 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c   number on  fail
1eed0 75 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61  ure". See the ma
1eee0 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c  npage for detail
1eef0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  s. */.      int 
1ef00 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  err;.      do{. 
1ef10 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46         err = osF
1ef20 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e  allocate(pFile->
1ef30 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20  h, buf.st_size, 
1ef40 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a  nSize-buf.st_siz
1ef50 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  e);.      }while
1ef60 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a  ( err==EINTR );.
1ef70 20 20 20 20 20 20 69 66 28 20 65 72 72 20 26 26        if( err &&
1ef80 20 65 72 72 21 3d 45 49 4e 56 41 4c 20 29 20 72   err!=EINVAL ) r
1ef90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1efa0 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
1efb0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1efc0 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
1efd0 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1efe0 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69  (), fake it. Wri
1eff0 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73  te a .      ** s
1f000 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68  ingle byte to th
1f010 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1f020 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66  ach block that f
1f030 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20  alls entirely.  
1f040 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
1f050 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1f060 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75  n. Then, if requ
1f070 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62  ired, a single b
1f080 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  yte.      ** at 
1f090 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29  offset (nSize-1)
1f0a0 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a  , to set the siz
1f0b0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
1f0c0 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
1f0d0 2a 20 54 68 69 73 20 69 73 20 61 20 73 69 6d 69  * This is a simi
1f0e0 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f  lar technique to
1f0f0 20 74 68 61 74 20 75 73 65 64 20 62 79 20 67 6c   that used by gl
1f100 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20  ibc on systems. 
1f110 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20       ** that do 
1f120 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1f130 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c  fallocate() call
1f140 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f150 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1f160 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1f170 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1f180 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1f190 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20  int nWrite = 0; 
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f1b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1f1c0 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e  ritten by seekAn
1f1d0 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1f1e0 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f200 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1f210 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1f220 20 69 57 72 69 74 65 20 3d 20 28 62 75 66 2e 73   iWrite = (buf.s
1f230 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c  t_size/nBlk)*nBl
1f240 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20  k + nBlk - 1;.  
1f250 20 20 20 20 61 73 73 65 72 74 28 20 69 57 72 69      assert( iWri
1f260 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20  te>=buf.st_size 
1f270 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f280 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e 42 6c   ((iWrite+1)%nBl
1f290 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  k)==0 );.      f
1f2a0 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57  or(/*no-op*/; iW
1f2b0 72 69 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d  rite<nSize+nBlk-
1f2c0 31 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20  1; iWrite+=nBlk 
1f2d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1f2e0 57 72 69 74 65 3e 3d 6e 53 69 7a 65 20 29 20 69  Write>=nSize ) i
1f2f0 57 72 69 74 65 20 3d 20 6e 53 69 7a 65 20 2d 20  Write = nSize - 
1f300 31 3b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74  1;.        nWrit
1f310 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1f320 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20  (pFile, iWrite, 
1f330 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  "", 1);.        
1f340 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20  if( nWrite!=1 ) 
1f350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1f360 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  ERR_WRITE;.     
1f370 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1f380 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
1f390 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1f3a0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
1f3b0 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42  pSizeMax>0 && nB
1f3c0 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte>pFile->mmapS
1f3d0 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ize ){.    int r
1f3e0 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  c;.    if( pFile
1f3f0 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a  ->szChunk<=0 ){.
1f400 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
1f410 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1f420 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
1f430 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
1f440 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
1f450 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  no);.        ret
1f460 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1f470 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1f480 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1f490 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1f4a0 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1f4b0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  }..    rc = unix
1f4c0 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e  Mapfile(pFile, n
1f4d0 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Byte);.    retur
1f4e0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
1f4f0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1f500 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1f510 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
1f520 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
1f530 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
1f540 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
1f550 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
1f560 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1f570 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
1f580 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1f590 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
1f5a0 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
1f5b0 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
1f5c0 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
1f5d0 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
1f5e0 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
1f5f0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f  atic void unixMo
1f600 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a  deBit(unixFile *
1f610 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20  pFile, unsigned 
1f620 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a  char mask, int *
1f630 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41  pArg){.  if( *pA
1f640 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72  rg<0 ){.    *pAr
1f650 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  g = (pFile->ctrl
1f660 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30  Flags & mask)!=0
1f670 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a  ;.  }else if( (*
1f680 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pArg)==0 ){.    
1f690 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1f6a0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c   &= ~mask;.  }el
1f6b0 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  se{.    pFile->c
1f6c0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  trlFlags |= mask
1f6d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ;.  }.}../* Forw
1f6e0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1f6f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1f700 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
1f710 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1f720 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  uf);../*.** Info
1f730 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
1f740 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
1f750 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
1f760 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1f770 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1f780 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1f790 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
1f7a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1f7b0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1f7c0 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  id;.  switch( op
1f7d0 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
1f7e0 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
1f7f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1f800 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
1f810 5f 57 52 49 54 45 29 0a 20 20 20 20 63 61 73 65  _WRITE).    case
1f820 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 45   SQLITE_FCNTL_BE
1f830 47 49 4e 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  GIN_ATOMIC_WRITE
1f840 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
1f850 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65   = osIoctl(pFile
1f860 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 53 54  ->h, F2FS_IOC_ST
1f870 41 52 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  ART_ATOMIC_WRITE
1f880 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f890 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc ? SQLITE_IOER
1f8a0 52 5f 42 45 47 49 4e 5f 41 54 4f 4d 49 43 20 3a  R_BEGIN_ATOMIC :
1f8b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f8c0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1f8d0 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 41  E_FCNTL_COMMIT_A
1f8e0 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20  TOMIC_WRITE: {. 
1f8f0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73       int rc = os
1f900 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Ioctl(pFile->h, 
1f910 46 32 46 53 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f  F2FS_IOC_COMMIT_
1f920 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20  ATOMIC_WRITE);. 
1f930 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
1f940 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f   SQLITE_IOERR_CO
1f950 4d 4d 49 54 5f 41 54 4f 4d 49 43 20 3a 20 53 51  MMIT_ATOMIC : SQ
1f960 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1f970 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f980 43 4e 54 4c 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54  CNTL_ROLLBACK_AT
1f990 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20  OMIC_WRITE: {.  
1f9a0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 49      int rc = osI
1f9b0 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  octl(pFile->h, F
1f9c0 32 46 53 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f  2FS_IOC_ABORT_VO
1f9d0 4c 41 54 49 4c 45 5f 57 52 49 54 45 29 3b 0a 20  LATILE_WRITE);. 
1f9e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f       return rc ?
1f9f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 4f   SQLITE_IOERR_RO
1fa00 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 20 3a 20  LLBACK_ATOMIC : 
1fa10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1fa20 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e  .#endif /* __lin
1fa30 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45  ux__ && SQLITE_E
1fa40 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
1fa50 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20  IC_WRITE */..   
1fa60 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1fa70 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
1fa80 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1fa90 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  g = pFile->eFile
1faa0 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75  Lock;.      retu
1fab0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1fac0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1fad0 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45  ITE_FCNTL_LAST_E
1fae0 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
1faf0 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
1fb00 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
1fb10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1fb20 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1fb30 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1fb40 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
1fb50 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43        pFile->szC
1fb60 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
1fb70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Arg;.      retur
1fb80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1fb90 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1fba0 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1fbb0 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  NT: {.      int 
1fbc0 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  rc;.      Simula
1fbd0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1fbe0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  1);.      rc = f
1fbf0 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69  cntlSizeHint(pFi
1fc00 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67  le, *(i64 *)pArg
1fc10 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1fc20 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1fc30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1fc40 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  rc;.    }.    ca
1fc50 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1fc60 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
1fc70 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
1fc80 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
1fc90 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69  _PERSIST_WAL, (i
1fca0 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1fcb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fcc0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1fcd0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1fce0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1fcf0 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  TE: {.      unix
1fd00 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
1fd10 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  NIXFILE_PSOW, (i
1fd20 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1fd30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fd40 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1fd50 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
1fd60 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
1fd70 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1fd80 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1fd90 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66  "%s", pFile->pVf
1fda0 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
1fdb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fdc0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1fdd0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
1fde0 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
1fdf0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
1fe00 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
1fe10 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56 66  oc64( pFile->pVf
1fe20 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
1fe30 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c  .      if( zTFil
1fe40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69  e ){.        uni
1fe50 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69  xGetTempname(pFi
1fe60 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
1fe70 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20  name, zTFile);. 
1fe80 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
1fe90 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
1fea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1feb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1fec0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1fed0 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
1fee0 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28  OVED: {.      *(
1fef0 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65  int*)pArg = file
1ff00 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b  HasMoved(pFile);
1ff10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ff20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1ff30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ff40 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55  BLE_SETLK_TIMEOU
1ff50 54 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  T.    case SQLIT
1ff60 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d  E_FCNTL_LOCK_TIM
1ff70 45 4f 55 54 3a 20 7b 0a 20 20 20 20 20 20 70 46  EOUT: {.      pF
1ff80 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75  ile->iBusyTimeou
1ff90 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b  t = *(int*)pArg;
1ffa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ffb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1ffc0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1ffd0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1ffe0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1fff0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
20000 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65  : {.      i64 ne
20010 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29  wLimit = *(i64*)
20020 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  pArg;.      int 
20030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20040 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
20050 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  it>sqlite3Global
20060 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b  Config.mxMmap ){
20070 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  .        newLimi
20080 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  t = sqlite3Globa
20090 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a  lConfig.mxMmap;.
200a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
200b0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * The value of n
200c0 65 77 4c 69 6d 69 74 20 6d 61 79 20 62 65 20 65  ewLimit may be e
200d0 76 65 6e 74 75 61 6c 6c 79 20 63 61 73 74 20 74  ventually cast t
200e0 6f 20 28 73 69 7a 65 5f 74 29 20 61 6e 64 20 70  o (size_t) and p
200f0 61 73 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  assed.      ** t
20100 6f 20 6d 6d 61 70 28 29 2e 20 52 65 73 74 72 69  o mmap(). Restri
20110 63 74 20 69 74 73 20 76 61 6c 75 65 20 74 6f 20  ct its value to 
20120 32 47 42 20 69 66 20 28 73 69 7a 65 5f 74 29 20  2GB if (size_t) 
20130 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73 74 20  is not at least 
20140 61 0a 20 20 20 20 20 20 2a 2a 20 36 34 2d 62 69  a.      ** 64-bi
20150 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20 20  t type. */.     
20160 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 30 20   if( newLimit>0 
20170 26 26 20 73 69 7a 65 6f 66 28 73 69 7a 65 5f 74  && sizeof(size_t
20180 29 3c 38 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  )<8 ){.        n
20190 65 77 4c 69 6d 69 74 20 3d 20 28 6e 65 77 4c 69  ewLimit = (newLi
201a0 6d 69 74 20 26 20 30 78 37 46 46 46 46 46 46 46  mit & 0x7FFFFFFF
201b0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
201c0 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
201d0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
201e0 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
201f0 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
20200 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
20210 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
20220 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
20230 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
20240 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
20250 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
20260 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
20270 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
20280 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66        unixUnmapf
20290 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ile(pFile);.    
202a0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d        rc = unixM
202b0 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
202c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
202d0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
202e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
202f0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
20300 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
20310 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68  e pager calls th
20320 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67  is method to sig
20330 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20  nal that it has 
20340 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f  done.    ** a ro
20350 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  llback and that 
20360 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
20370 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e  therefore unchan
20380 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ged and.    ** i
20390 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b  t hence it is OK
203a0 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63   for the transac
203b0 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e  tion change coun
203c0 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  ter to be.    **
203d0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20   unchanged..    
203e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
203f0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
20400 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28  ANGED: {.      (
20410 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
20420 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
20430 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20440 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
20450 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
20460 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
20470 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
20480 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73  APPLE__).    cas
20490 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
204a0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
204b0 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
204c0 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b  E_FCNTL_GET_LOCK
204d0 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
204e0 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46     return proxyF
204f0 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70  ileControl(id,op
20500 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65  ,pArg);.    }.#e
20510 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
20520 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
20530 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
20540 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d  _APPLE__) */.  }
20550 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20560 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
20570 0a 2a 2a 20 49 66 20 70 46 64 2d 3e 73 65 63 74  .** If pFd->sect
20580 6f 72 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65  orSize is non-ze
20590 72 6f 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ro when this fun
205a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
205b0 20 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f   it is a.** no-o
205c0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
205d0 65 20 76 61 6c 75 65 73 20 6f 66 20 70 46 64 2d  e values of pFd-
205e0 3e 73 65 63 74 6f 72 53 69 7a 65 20 61 6e 64 20  >sectorSize and 
205f0 0a 2a 2a 20 70 46 64 2d 3e 64 65 76 69 63 65 43  .** pFd->deviceC
20600 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 61  haracteristics a
20610 72 65 20 73 65 74 20 61 63 63 6f 72 64 69 6e 67  re set according
20620 20 74 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73   to the file-sys
20630 74 65 6d 20 0a 2a 2a 20 63 68 61 72 61 63 74 65  tem .** characte
20640 72 69 73 74 69 63 73 2e 20 0a 2a 2a 0a 2a 2a 20  ristics. .**.** 
20650 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 76 65  There are two ve
20660 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
20670 75 6e 63 74 69 6f 6e 2e 20 4f 6e 65 20 66 6f 72  unction. One for
20680 20 51 4e 58 20 61 6e 64 20 6f 6e 65 20 66 6f 72   QNX and one for
20690 20 61 6c 6c 0a 2a 2a 20 6f 74 68 65 72 20 73 79   all.** other sy
206a0 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
206b0 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 73 74 61  f __QNXNTO__.sta
206c0 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69  tic void setDevi
206d0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
206e0 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  s(unixFile *pFd)
206f0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  {.  assert( pFd-
20700 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
20710 69 73 74 69 63 73 3d 3d 30 20 7c 7c 20 70 46 64  istics==0 || pFd
20720 2d 3e 73 65 63 74 6f 72 53 69 7a 65 21 3d 30 20  ->sectorSize!=0 
20730 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 73 65  );.  if( pFd->se
20740 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 7b 0a 23  ctorSize==0 ){.#
20750 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  if defined(__lin
20760 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64  ux__) && defined
20770 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42  (SQLITE_ENABLE_B
20780 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ATCH_ATOMIC_WRIT
20790 45 29 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  E).    int res;.
207a0 20 20 20 20 75 33 32 20 66 20 3d 20 30 3b 0a 0a      u32 f = 0;..
207b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
207c0 20 73 75 70 70 6f 72 74 20 66 6f 72 20 46 32 46   support for F2F
207d0 53 20 61 74 6f 6d 69 63 20 62 61 74 63 68 20 77  S atomic batch w
207e0 72 69 74 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65  rites. */.    re
207f0 73 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 64 2d  s = osIoctl(pFd-
20800 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 47 45 54  >h, F2FS_IOC_GET
20810 5f 46 45 41 54 55 52 45 53 2c 20 26 66 29 3b 0a  _FEATURES, &f);.
20820 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26      if( res==0 &
20830 26 20 28 66 20 26 20 46 32 46 53 5f 46 45 41 54  & (f & F2FS_FEAT
20840 55 52 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  URE_ATOMIC_WRITE
20850 29 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ) ){.      pFd->
20860 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20870 73 74 69 63 73 20 3d 20 53 51 4c 49 54 45 5f 49  stics = SQLITE_I
20880 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
20890 43 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  C;.    }.#endif 
208a0 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20  /* __linux__ && 
208b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41  SQLITE_ENABLE_BA
208c0 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  TCH_ATOMIC_WRITE
208d0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
208e0 74 68 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  the POWERSAFE_OV
208f0 45 52 57 52 49 54 45 20 66 6c 61 67 20 69 66 20  ERWRITE flag if 
20900 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
20910 20 20 69 66 28 20 70 46 64 2d 3e 63 74 72 6c 46    if( pFd->ctrlF
20920 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
20930 50 53 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 46  PSOW ){.      pF
20940 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  d->deviceCharact
20950 65 72 69 73 74 69 63 73 20 7c 3d 20 53 51 4c 49  eristics |= SQLI
20960 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
20970 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20  FE_OVERWRITE;.  
20980 20 20 7d 0a 0a 20 20 20 20 70 46 64 2d 3e 73 65    }..    pFd->se
20990 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54  ctorSize = SQLIT
209a0 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
209b0 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  _SIZE;.  }.}.#el
209c0 73 65 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  se.#include <sys
209d0 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e  /dcmd_blk.h>.#in
209e0 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76  clude <sys/statv
209f0 66 73 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  fs.h>.static voi
20a00 64 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61  d setDeviceChara
20a10 63 74 65 72 69 73 74 69 63 73 28 75 6e 69 78 46  cteristics(unixF
20a20 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
20a30 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  f( pFile->sector
20a40 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Size == 0 ){.   
20a50 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20   struct statvfs 
20a60 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a  fsInfo;.       .
20a70 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75      /* Set defau
20a80 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70  lts for non-supp
20a90 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d  orted filesystem
20aa0 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  s */.    pFile->
20ab0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
20ac0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
20ad0 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69  OR_SIZE;.    pFi
20ae0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
20af0 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
20b00 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73 28     if( fstatvfs(
20b10 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66  pFile->h, &fsInf
20b20 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20  o) == -1 ) {.   
20b30 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
20b40 0a 0a 20 20 20 20 69 66 28 20 21 73 74 72 63 6d  ..    if( !strcm
20b50 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
20b60 79 70 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a  ype, "tmp") ) {.
20b70 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
20b80 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
20b90 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
20ba0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
20bb0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
20bc0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
20bd0 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20  CAP_ATOMIC4K |  
20be0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20       /* All ram 
20bf0 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65  filesystem write
20c00 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
20c10 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
20c20 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
20c30 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
20c40 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
20c50 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c80 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
20c90 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
20ca0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
20cb0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
20cc0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
20cd0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
20ce0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
20d20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
20d30 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
20d40 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66  if( strstr(fsInf
20d50 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65  o.f_basetype, "e
20d60 74 66 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70  tfs") ){.      p
20d70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20d80 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
20d90 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
20da0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20db0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
20dc0 2f 2a 20 65 74 66 73 20 63 6c 75 73 74 65 72 20  /* etfs cluster 
20dd0 73 69 7a 65 20 77 72 69 74 65 73 20 61 72 65 20  size writes are 
20de0 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
20df0 20 20 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72    (pFile->sector
20e00 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
20e10 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
20e20 35 31 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53  512) |.        S
20e30 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
20e40 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
20e50 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
20e60 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
20e70 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
20ea0 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
20eb0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
20ec0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
20ed0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
20ee0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
20ef0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
20f00 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
20f30 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
20f40 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
20f50 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63   }else if( !strc
20f60 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
20f70 74 79 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b  type, "qnx6") ){
20f80 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
20f90 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
20fa0 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
20fb0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
20fc0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
20fd0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
20fe0 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20  OCAP_ATOMIC |   
20ff0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c        /* All fil
21000 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61  esystem writes a
21010 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
21020 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
21030 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
21040 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
21050 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
21060 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21090 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
210a0 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
210b0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
210c0 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
210d0 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
210e0 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
210f0 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21120 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
21130 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
21140 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
21150 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
21160 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78  f_basetype, "qnx
21170 34 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  4") ){.      pFi
21180 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
21190 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
211a0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
211b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
211c0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
211d0 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
211e0 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
211f0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
21200 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
21210 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
21220 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
21230 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
21240 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
21250 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
21260 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
21270 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
21280 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
21290 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
212a0 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
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 2a 2a 20 73 6f 20            ** so 
212d0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
212e0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
212f0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72  }else if( strstr
21300 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
21310 70 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20  pe, "dos") ){.  
21320 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
21330 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
21340 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
21350 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
21360 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
21370 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
21380 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
21390 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
213a0 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
213b0 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
213c0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
213d0 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
213e0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
213f0 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
21400 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
21410 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
21420 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
21430 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
21440 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
21450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
21480 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
21490 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
214a0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
214b0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
214c0 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
214d0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
214e0 32 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63  2 |      /* bloc
214f0 6b 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  ks are atomic */
21500 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
21510 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
21520 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
21530 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
21540 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
21550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21570 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
21580 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
21590 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a         0;.    }.
215a0 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68    }.  /* Last ch
215b0 61 6e 63 65 20 76 65 72 69 66 69 63 61 74 69 6f  ance verificatio
215c0 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 74 6f  n.  If the secto
215d0 72 20 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d  r size isn't a m
215e0 75 6c 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20  ultiple of 512. 
215f0 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27   ** then it isn'
21600 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28  t valid.*/.  if(
21610 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
21620 7a 65 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b  ze % 512 != 0 ){
21630 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69  .    pFile->devi
21640 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
21650 73 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  s = 0;.    pFile
21660 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53  ->sectorSize = S
21670 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
21680 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
21690 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
216a0 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
216b0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
216c0 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
216d0 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
216e0 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
216f0 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
21700 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
21710 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
21720 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
21730 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
21740 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
21750 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
21760 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
21770 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
21780 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
21790 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
217a0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
217b0 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
217c0 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
217d0 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
217e0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
217f0 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
21800 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
21810 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
21820 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
21830 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
21840 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
21850 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
21860 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
21870 65 2a 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69  e*)id;.  setDevi
21880 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
21890 73 28 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e  s(pFd);.  return
218a0 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65   pFd->sectorSize
218b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
218c0 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
218d0 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
218e0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
218f0 20 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74   This VFS is set
21900 20 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51   up to return SQ
21910 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
21920 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62  SAFE_OVERWRITE b
21930 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f  y default..** Ho
21940 77 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69  wever, that choi
21950 63 65 20 69 73 20 63 6f 6e 74 72 6f 76 65 72 73  ce is controvers
21960 69 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69  ial since techni
21970 63 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c  cally the underl
21980 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73  ying.** file sys
21990 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77  tem does not alw
219a0 61 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65  ays provide powe
219b0 72 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73  rsafe overwrites
219c0 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  .  (In other.** 
219d0 77 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70  words, after a p
219e0 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c  ower-loss event,
219f0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69   parts of the fi
21a00 6c 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76  le that were nev
21a10 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69  er.** written mi
21a20 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
21a30 20 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65   altered.)  Howe
21a40 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65  ver, non-PSOW be
21a50 68 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a  havior is very,.
21a60 2a 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41  ** very rare.  A
21a70 6e 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f  nd asserting PSO
21a80 57 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20  W makes a large 
21a90 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  reduction in the
21aa0 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65   amount.** of re
21ab0 71 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a  quired I/O for j
21ac0 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65  ournaling, since
21ad0 20 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e   a lot of paddin
21ae0 67 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e  g is eliminated.
21af0 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c  .**  Hence, whil
21b00 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  e POWERSAFE_OVER
21b10 57 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64  WRITE is on by d
21b20 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73  efault, there is
21b30 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a   a file-control.
21b40 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ** available to 
21b50 74 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20  turn it off and 
21b60 55 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65  URI query parame
21b70 74 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ter available to
21b80 20 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f   turn it off..*/
21b90 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
21ba0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
21bb0 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
21bc0 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
21bd0 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
21be0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 74 44  File*)id;.  setD
21bf0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
21c00 74 69 63 73 28 70 46 64 29 3b 0a 20 20 72 65 74  tics(pFd);.  ret
21c10 75 72 6e 20 70 46 64 2d 3e 64 65 76 69 63 65 43  urn pFd->deviceC
21c20 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a  haracteristics;.
21c30 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
21c40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
21c50 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
21c60 4d 41 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a  MAP_SIZE>0../*.*
21c70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 79 73  * Return the sys
21c80 74 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  tem page size..*
21c90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21ca0 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  on should not be
21cb0 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79   called directly
21cc0 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69   by other code i
21cd0 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a  n this file. .**
21ce0 20 49 6e 73 74 65 61 64 2c 20 69 74 20 73 68 6f   Instead, it sho
21cf0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 76 69  uld be called vi
21d00 61 20 6d 61 63 72 6f 20 6f 73 47 65 74 70 61 67  a macro osGetpag
21d10 65 73 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  esize()..*/.stat
21d20 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61  ic int unixGetpa
21d30 67 65 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69  gesize(void){.#i
21d40 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72  f OS_VXWORKS.  r
21d50 65 74 75 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69  eturn 1024;.#eli
21d60 66 20 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53  f defined(_BSD_S
21d70 4f 55 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20  OURCE).  return 
21d80 67 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23  getpagesize();.#
21d90 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69  else.  return (i
21da0 6e 74 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50  nt)sysconf(_SC_P
21db0 41 47 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66  AGESIZE);.#endif
21dc0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  .}..#endif /* !d
21dd0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
21de0 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
21df0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
21e00 30 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  0 */..#ifndef SQ
21e10 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
21e20 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
21e30 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e   to represent an
21e40 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
21e50 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  uffer.  .**.** W
21e60 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72  hen multiple thr
21e70 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e  eads all referen
21e80 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d  ce the same wal-
21e90 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65  index, each thre
21ea0 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77  ad.** has its ow
21eb0 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  n unixShm object
21ec0 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70  , but they all p
21ed0 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
21ee0 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20   instance.** of 
21ef0 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65  this unixShmNode
21f00 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
21f10 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77  er words, each w
21f20 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  al-index is open
21f30 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20  ed.** only once 
21f40 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
21f50 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e  ** Each unixShmN
21f60 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  ode object is co
21f70 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e  nnected to a sin
21f80 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  gle unixInodeInf
21f90 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20  o object..** We 
21fa0 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74  could coalesce t
21fb0 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  his object into 
21fc0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62  unixInodeInfo, b
21fd0 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65  ut that would me
21fe0 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e  an.** every open
21ff0 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20   file that does 
22000 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d  not use shared m
22010 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20  emory (in other 
22020 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f  words, most.** o
22030 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64  pen files) would
22040 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61   have to carry a
22050 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61  round this extra
22060 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53   information.  S
22070 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f  o.** the unixIno
22080 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f  deInfo object co
22090 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
220a0 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d   to this unixShm
220b0 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61  Node object.** a
220c0 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  nd the unixShmNo
220d0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  de object is cre
220e0 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e  ated only when n
220f0 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69  eeded..**.** uni
22100 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  xMutexHeld() mus
22110 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63  t be true when c
22120 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72  reating or destr
22130 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62  oying.** this ob
22140 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65  ject or while re
22150 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
22160 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
22170 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ields:.**.**    
22180 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65    nRef.**.** The
22190 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
221a0 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
221b0 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
221c0 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
221d0 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
221e0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
221f0 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78  *.** Either unix
22200 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
22210 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e  st be held or un
22220 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
22230 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74  0 and.** unixMut
22240 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
22250 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
22260 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
22270 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
22280 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
22290 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
222a0 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f  Node {.  unixIno
222b0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
222c0 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65      /* unixInode
222d0 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74  Info that owns t
222e0 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a  his SHM node */.
222f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
22300 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
22310 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
22320 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
22330 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
22340 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
22350 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70  ame of the mmapp
22360 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
22370 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
22380 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
22390 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
223a0 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
223b0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
223c0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65  /* Size of share
223d0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
223e0 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f   */.  u16 nRegio
223f0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
22400 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
22410 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  y apRegion */.  
22420 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20  u8 isReadonly;  
22430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
22440 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20  ue if read-only 
22450 2a 2f 0a 20 20 75 38 20 69 73 55 6e 6c 6f 63 6b  */.  u8 isUnlock
22460 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
22470 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 44 4d  /* True if no DM
22480 53 20 6c 6f 63 6b 20 68 65 6c 64 20 2a 2f 0a 20  S lock held */. 
22490 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e   char **apRegion
224a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
224b0 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73  rray of mapped s
224c0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
224d0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
224e0 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
224f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22500 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  f unixShm object
22510 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
22520 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  is */.  unixShm 
22530 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
22540 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68     /* All unixSh
22550 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
22560 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69  ng to this */.#i
22570 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
22580 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b  G.  u8 exclMask;
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
225a0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
225b0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
225c0 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73  /.  u8 sharedMas
225d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
225e0 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
225f0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
22600 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
22610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22620 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e  ext available un
22630 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a  ixShm.id value *
22640 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
22650 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
22660 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
22670 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f  this VFS to reco
22680 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  rd the state of 
22690 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65  an.** open share
226a0 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74  d memory connect
226b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
226c0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
226d0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
226e0 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74  when this object
226f0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a   is created and.
22700 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ** are read-only
22710 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a   thereafter:.**.
22720 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46  **    unixShm.pF
22730 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68  ile.**    unixSh
22740 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  m.id.**.** All o
22750 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
22760 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65  read/write.  The
22770 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e   unixShm.pFile->
22780 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
22790 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
227a0 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
227b0 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
227c0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b  struct unixShm {
227d0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
227e0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a  pShmNode;     /*
227f0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
22800 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
22810 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ct */.  unixShm 
22820 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
22830 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53     /* Next unixS
22840 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
22850 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
22860 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22880 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
22890 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
228a0 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64  mutex */.  u8 id
228b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
228c0 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
228d0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
228e0 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68  ithin its unixSh
228f0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73  mNode */.  u16 s
22900 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
22910 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
22920 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
22930 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
22940 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
22950 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
22960 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
22970 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ld */.};../*.** 
22980 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
22990 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
229a0 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42  efine UNIX_SHM_B
229b0 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
229c0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
229d0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
229e0 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
229f0 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44  efine UNIX_SHM_D
22a00 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f  MS    (UNIX_SHM_
22a10 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
22a20 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
22a30 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
22a40 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20  .** Apply posix 
22a50 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66  advisory locks f
22a60 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f  or all bytes fro
22a70 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f  m ofst through o
22a80 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c  fst+n-1..**.** L
22a90 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68  ocks block if th
22aa0 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c  e mask is exactl
22ab0 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64  y UNIX_SHM_C and
22ac0 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e   are non-blockin
22ad0 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  g.** otherwise..
22ae0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
22af0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
22b00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
22b10 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  le,       /* Ope
22b20 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  n connection to 
22b30 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  the WAL file */.
22b40 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
22b50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
22b60 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
22b70 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e   F_WRLCK */.  in
22b80 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
22b90 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
22ba0 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  te of the lockin
22bb0 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  g range */.  int
22bc0 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
22bd0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22be0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
22bf0 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  /.){.  unixShmNo
22c00 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a  de *pShmNode; /*
22c10 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
22c20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
22c30 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
22c40 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  */.  struct floc
22c50 6b 20 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  k f;        /* T
22c60 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
22c70 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  y locking struct
22c80 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ure */.  int rc 
22c90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
22ca0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
22cb0 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a  orm fcntl() */..
22cc0 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
22cd0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
22ce0 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
22cf0 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
22d00 72 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20  r */.  pShmNode 
22d10 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
22d20 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
22d30 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
22d40 52 65 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  Ref==0 || sqlite
22d50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68  3_mutex_held(pSh
22d60 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 29 3b  mNode->mutex) );
22d70 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
22d80 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
22d90 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
22da0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
22db0 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
22dc0 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
22dd0 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
22de0 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
22df0 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
22e00 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
22e10 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  K );..  if( pShm
22e20 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
22e30 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
22e40 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
22e50 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 66 2e  meters */.    f.
22e60 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70  l_type = lockTyp
22e70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63  e;.    f.l_whenc
22e80 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
22e90 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66    f.l_start = of
22ea0 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20  st;.    f.l_len 
22eb0 3d 20 6e 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73  = n;.    rc = os
22ec0 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79  SetPosixAdvisory
22ed0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  Lock(pShmNode->h
22ee0 2c 20 26 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20  , &f, pFile);.  
22ef0 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29    rc = (rc!=(-1)
22f00 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  ) ? SQLITE_OK : 
22f10 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
22f20 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
22f30 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74  e global lock st
22f40 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67  ate and do debug
22f50 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64   tracing */.#ifd
22f60 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
22f70 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20    { u16 mask;.  
22f80 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
22f90 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d  CK "));.  mask =
22fa0 20 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66   ofst>31 ? 0xfff
22fb0 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  f : (1<<(ofst+n)
22fc0 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
22fd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22fe0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f  OK ){.    if( lo
22ff0 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
23000 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
23010 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22  (("unlock %d ok"
23020 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
23030 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
23040 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
23050 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
23060 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
23070 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
23080 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43  lockType==F_RDLC
23090 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
230a0 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25  CE(("read-lock %
230b0 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
230c0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
230d0 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
230e0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
230f0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
23100 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  mask;.    }else{
23110 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
23120 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
23130 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
23140 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
23150 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20  d ok", ofst));. 
23160 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65       pShmNode->e
23170 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
23180 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
23190 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
231a0 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
231b0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  lse{.    if( loc
231c0 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
231d0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
231e0 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ("unlock %d fail
231f0 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
23200 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
23210 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
23220 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
23230 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64  read-lock failed
23240 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  "));.    }else{.
23250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
23260 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
23270 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
23280 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
23290 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29   failed", ofst))
232a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
232b0 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72  TRACE((" - after
232c0 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c  wards %03x,%03x\
232d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
232e0 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
232f0 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65  ask, pShmNode->e
23300 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23  xclMask));.  }.#
23310 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
23320 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f  rc;        .}../
23330 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
23340 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  minimum number o
23350 66 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f  f 32KB shm regio
23360 6e 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ns that should b
23370 65 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61  e mapped at.** a
23380 20 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20   time, assuming 
23390 74 68 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e  that each mappin
233a0 67 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74  g must be an int
233b0 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
233c0 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
233d0 73 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65  system page-size
233e0 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c  ..**.** Usually,
233f0 20 74 68 69 73 20 69 73 20 31 2e 20 54 68 65 20   this is 1. The 
23400 65 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20  exception seems 
23410 74 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74 68  to be systems th
23420 61 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65  at are configure
23430 64 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42  d.** to use 64KB
23440 20 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73   pages - in this
23450 20 63 61 73 65 20 65 61 63 68 20 6d 61 70 70 69   case each mappi
23460 6e 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74  ng must cover at
23470 20 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68   least two.** sh
23480 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  m regions..*/.st
23490 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
234a0 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69  RegionPerMap(voi
234b0 64 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20  d){.  int shmsz 
234c0 3d 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20  = 32*1024;      
234d0 20 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67        /* SHM reg
234e0 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  ion size */.  in
234f0 74 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61  t pgsz = osGetpa
23500 67 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53  gesize();   /* S
23510 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20  ystem page size 
23520 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28 70  */.  assert( ((p
23530 67 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20  gsz-1)&pgsz)==0 
23540 29 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  );   /* Page siz
23550 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
23560 72 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20  r of 2 */.  if( 
23570 70 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74  pgsz<shmsz ) ret
23580 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
23590 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f  pgsz/shmsz;.}../
235a0 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75  *.** Purge the u
235b0 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  nixShmNodeList l
235c0 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
235d0 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e  es with unixShmN
235e0 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
235f0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
23600 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
23610 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
23620 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
23630 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
23640 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
23650 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
23660 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
23670 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65  hmPurge(unixFile
23680 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68   *pFd){.  unixSh
23690 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e  mNode *p = pFd->
236a0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
236b0 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
236c0 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
236d0 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53   if( p && ALWAYS
236e0 28 70 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a  (p->nRef==0) ){.
236f0 20 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d      int nShmPerM
23700 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69  ap = unixShmRegi
23710 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20  onPerMap();.    
23720 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
23730 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46  t( p->pInode==pF
23740 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  d->pInode );.   
23750 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
23760 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
23770 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
23780 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68  >nRegion; i+=nSh
23790 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20 20 20 20  mPerMap){.      
237a0 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
237b0 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28         osMunmap(
237c0 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20  p->apRegion[i], 
237d0 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  p->szRegion);.  
237e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
237f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23800 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b  p->apRegion[i]);
23810 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23820 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23830 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20  p->apRegion);.  
23840 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
23850 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
23860 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f  ose(pFd, p->h, _
23870 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
23880 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  p->h = -1;.    }
23890 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e  .    p->pInode->
238a0 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  pShmNode = 0;.  
238b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
238c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
238d0 54 68 65 20 44 4d 53 20 6c 6f 63 6b 20 68 61 73  The DMS lock has
238e0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 74 61   not yet been ta
238f0 6b 65 6e 20 6f 6e 20 73 68 6d 20 66 69 6c 65 20  ken on shm file 
23900 70 53 68 6d 4e 6f 64 65 2e 20 41 74 74 65 6d 70  pShmNode. Attemp
23910 74 20 74 6f 0a 2a 2a 20 74 61 6b 65 20 69 74 20  t to.** take it 
23920 6e 6f 77 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  now. Return SQLI
23930 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
23940 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
23950 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
23960 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
23970 20 49 66 20 74 68 65 20 44 4d 53 20 63 61 6e 6e   If the DMS cann
23980 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20 62 65 63  ot be locked bec
23990 61 75 73 65 20 74 68 69 73 20 69 73 20 61 20 72  ause this is a r
239a0 65 61 64 6f 6e 6c 79 5f 73 68 6d 3d 31 20 0a 2a  eadonly_shm=1 .*
239b0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  * connection and
239c0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
239d0 73 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  s already holds 
239e0 61 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 0a 2a  a lock, return.*
239f0 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  * SQLITE_READONL
23a00 59 5f 43 41 4e 54 49 4e 49 54 20 61 6e 64 20 73  Y_CANTINIT and s
23a10 65 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55  et pShmNode->isU
23a20 6e 6c 6f 63 6b 65 64 3d 31 2e 0a 2a 2f 0a 73 74  nlocked=1..*/.st
23a30 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
23a40 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e  kSharedMemory(un
23a50 69 78 46 69 6c 65 20 2a 70 44 62 46 64 2c 20 75  ixFile *pDbFd, u
23a60 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
23a70 4e 6f 64 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Node){.  struct 
23a80 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
23a90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23aa0 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 46 5f 47 45  ;..  /* Use F_GE
23ab0 54 4c 4b 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  TLK to determine
23ac0 20 74 68 65 20 6c 6f 63 6b 73 20 6f 74 68 65 72   the locks other
23ad0 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 68   processes are h
23ae0 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 74  olding.  ** on t
23af0 68 65 20 44 4d 53 20 62 79 74 65 2e 20 49 66 20  he DMS byte. If 
23b00 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  it indicates tha
23b10 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  t another proces
23b20 73 20 69 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a  s is holding.  *
23b30 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  * a SHARED lock,
23b40 20 74 68 65 6e 20 74 68 69 73 20 70 72 6f 63 65   then this proce
23b50 73 73 20 6d 61 79 20 61 6c 73 6f 20 74 61 6b 65  ss may also take
23b60 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
23b70 20 2a 2a 20 61 6e 64 20 70 72 6f 63 65 65 64 20   ** and proceed 
23b80 77 69 74 68 20 6f 70 65 6e 69 6e 67 20 74 68 65  with opening the
23b90 20 2a 2d 73 68 6d 20 66 69 6c 65 2e 20 0a 20 20   *-shm file. .  
23ba0 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 6e  **.  ** Or, if n
23bb0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
23bc0 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c  is holding any l
23bd0 6f 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ock, then this p
23be0 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 74  rocess.  ** is t
23bf0 68 65 20 66 69 72 73 74 20 74 6f 20 6f 70 65 6e  he first to open
23c00 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73   it. In this cas
23c10 65 20 74 61 6b 65 20 61 6e 20 45 58 43 4c 55 53  e take an EXCLUS
23c20 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
23c30 20 20 2a 2a 20 44 4d 53 20 62 79 74 65 20 61 6e    ** DMS byte an
23c40 64 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 2a  d truncate the *
23c50 2d 73 68 6d 20 66 69 6c 65 20 74 6f 20 7a 65 72  -shm file to zer
23c60 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
23c70 20 54 68 65 6e 0a 20 20 2a 2a 20 64 6f 77 6e 67   Then.  ** downg
23c80 72 61 64 65 20 74 6f 20 61 20 53 48 41 52 45 44  rade to a SHARED
23c90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d 53   lock on the DMS
23ca0 20 62 79 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   byte..  **.  **
23cb0 20 49 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   If another proc
23cc0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ess is holding a
23cd0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
23ce0 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74 65   on the DMS byte
23cf0 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  ,.  ** return SQ
23d00 4c 49 54 45 5f 42 55 53 59 20 74 6f 20 74 68 65  LITE_BUSY to the
23d10 20 63 61 6c 6c 65 72 20 28 69 74 20 77 69 6c 6c   caller (it will
23d20 20 74 72 79 20 61 67 61 69 6e 29 2e 20 41 6e 20   try again). An 
23d30 65 61 72 6c 69 65 72 0a 20 20 2a 2a 20 76 65 72  earlier.  ** ver
23d40 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 63 6f 64  sion of this cod
23d50 65 20 61 74 74 65 6d 70 74 65 64 20 74 68 65 20  e attempted the 
23d60 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 74 20 74  SHARED lock at t
23d70 68 69 73 20 70 6f 69 6e 74 2e 20 42 75 74 0a 20  his point. But. 
23d80 20 2a 2a 20 74 68 69 73 20 69 6e 74 72 6f 64 75   ** this introdu
23d90 63 65 64 20 61 20 73 75 62 74 6c 65 20 72 61 63  ced a subtle rac
23da0 65 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 69 66 20  e condition: if 
23db0 74 68 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  the process hold
23dc0 69 6e 67 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49  ing.  ** EXCLUSI
23dd0 56 45 20 66 61 69 6c 65 64 20 6a 75 73 74 20 62  VE failed just b
23de0 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
23df0 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2c   the *-shm file,
23e00 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20   then this.  ** 
23e10 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
23e20 65 6e 20 61 6e 64 20 75 73 65 20 74 68 65 20 2a  en and use the *
23e30 2d 73 68 6d 20 66 69 6c 65 20 77 69 74 68 6f 75  -shm file withou
23e40 74 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  t truncating it.
23e50 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  .  ** And if the
23e60 20 2a 2d 73 68 6d 20 66 69 6c 65 20 68 61 73 20   *-shm file has 
23e70 62 65 65 6e 20 63 6f 72 72 75 70 74 65 64 20 62  been corrupted b
23e80 79 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  y a power failur
23e90 65 20 6f 72 0a 20 20 2a 2a 20 73 79 73 74 65 6d  e or.  ** system
23ea0 20 63 72 61 73 68 2c 20 74 68 65 20 64 61 74 61   crash, the data
23eb0 62 61 73 65 20 69 74 73 65 6c 66 20 6d 61 79 20  base itself may 
23ec0 61 6c 73 6f 20 62 65 63 6f 6d 65 20 63 6f 72 72  also become corr
23ed0 75 70 74 2e 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  upt.  */.  lock.
23ee0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
23ef0 53 45 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74  SET;.  lock.l_st
23f00 61 72 74 20 3d 20 55 4e 49 58 5f 53 48 4d 5f 44  art = UNIX_SHM_D
23f10 4d 53 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  MS;.  lock.l_len
23f20 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 74   = 1;.  lock.l_t
23f30 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
23f40 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 53 68   if( osFcntl(pSh
23f50 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  mNode->h, F_GETL
23f60 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 20 7b  K, &lock)!=0 ) {
23f70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
23f80 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d  _IOERR_LOCK;.  }
23f90 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
23fa0 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
23fb0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
23fc0 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b  e->isReadonly ){
23fd0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
23fe0 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 31 3b  >isUnlocked = 1;
23ff0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
24000 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
24010 49 4e 49 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  INIT;.    }else{
24020 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
24030 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
24040 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e  bFd, F_WRLCK, UN
24050 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IX_SHM_DMS, 1);.
24060 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
24070 4c 49 54 45 5f 4f 4b 20 26 26 20 72 6f 62 75 73  LITE_OK && robus
24080 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d  t_ftruncate(pShm
24090 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20  Node->h, 0) ){. 
240a0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
240b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
240c0 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 22 66  IOERR_SHMOPEN,"f
240d0 74 72 75 6e 63 61 74 65 22 2c 70 53 68 6d 4e 6f  truncate",pShmNo
240e0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
240f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24100 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c  }else if( lock.l
24110 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
24120 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
24130 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 69  E_BUSY;.  }..  i
24140 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24150 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24160 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55  lock.l_type==F_U
24170 4e 4c 43 4b 20 7c 7c 20 6c 6f 63 6b 2e 6c 5f 74  NLCK || lock.l_t
24180 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a  ype==F_RDLCK );.
24190 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
241a0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
241b0 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f  , F_RDLCK, UNIX_
241c0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d  SHM_DMS, 1);.  }
241d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
241e0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68  ./*.** Open a sh
241f0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
24200 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
24210 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
24220 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20  ile pDbFd.  .** 
24230 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
24240 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
24250 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ses mmapped file
24260 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  s..**.** The fil
24270 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
24280 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ent shared-memor
24290 79 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65  y is in the same
242a0 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73   directory.** as
242b0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
242c0 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20  se file and has 
242d0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
242e0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
242f0 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20  se.** file with 
24300 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69  the "-shm" suffi
24310 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78  x added.  For ex
24320 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61  ample, if the da
24330 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
24340 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  s "/home/user1/c
24350 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74  onfig.db" then t
24360 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  he file that is 
24370 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70  created and mmap
24380 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65  ped.** for share
24390 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
243a0 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75   called "/home/u
243b0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73  ser1/config.db-s
243c0 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f  hm".  .**.** Ano
243d0 74 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f  ther approach to
243e0 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73   is to use files
243f0 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20   in /dev/shm or 
24400 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a  /dev/tmp or an.*
24410 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70  * some other tmp
24420 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66  fs mount. But if
24430 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66   a file in a dif
24440 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  ferent directory
24450 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74  .** from the dat
24460 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73  abase file is us
24470 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69  ed, then differi
24480 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  ng access permis
24490 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68  sions.** or a ch
244a0 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75  root() might cau
244b0 73 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74  se two different
244c0 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68   processes on th
244d0 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61  e same.** databa
244e0 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69  se to end up usi
244f0 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  ng different fil
24500 65 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  es for shared me
24510 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69  mory - .** meani
24520 6e 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65  ng that their me
24530 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72  mory would not r
24540 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20  eally be shared 
24550 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69  - resulting.** i
24560 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  n database corru
24570 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65  ption.  Neverthe
24580 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73  less, this tmpfs
24590 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63   file usage.** c
245a0 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74  an be enabled at
245b0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73   compile-time us
245c0 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d  ing -DSQLITE_SHM
245d0 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76  _DIRECTORY="/dev
245e0 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20  /shm".** or the 
245f0 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65  equivalent.  The
24600 20 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49   use of the SQLI
24610 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
24620 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a   compile-time.**
24630 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20   option results 
24640 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
24650 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69  le build of SQLi
24660 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53  te;  builds of S
24670 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69  QLite.** that wi
24680 74 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c  th differing SQL
24690 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
246a0 59 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d  Y settings attem
246b0 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  pt to use the.**
246c0 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
246d0 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ile at the same 
246e0 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63  time, database c
246f0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c  orruption will l
24700 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e  ikely.** result.
24710 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   The SQLITE_SHM_
24720 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
24730 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
24740 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22   considered.** "
24750 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64  unsupported" and
24760 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20   may go away in 
24770 61 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20  a future SQLite 
24780 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57  release..**.** W
24790 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
247a0 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
247b0 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
247c0 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
247d0 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
247e0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
247f0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
24800 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
24810 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
24820 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
24830 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
24840 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
24850 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
24860 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
24870 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
24880 61 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29  ase file (pDbFd)
24890 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75   is using the "u
248a0 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a  nix-excl" VFS.**
248b0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
248c0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
248d0 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
248e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
248f0 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f  and.** that no o
24900 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
24910 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  re able to read 
24920 6f 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74  or write the dat
24930 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68  abase.  In.** th
24940 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e  at case, we do n
24950 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73  ot really need s
24960 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e  hared memory.  N
24970 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a  o shared memory.
24980 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ** file is creat
24990 65 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20  ed.  The shared 
249a0 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73  memory will be s
249b0 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65  imulated with he
249c0 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ap memory..*/.st
249d0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
249e0 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e  nSharedMemory(un
249f0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  ixFile *pDbFd){.
24a00 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
24a10 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
24a20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
24a30 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
24a40 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
24a50 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
24a60 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  de;   /* The und
24a70 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
24a80 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
24a90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
24aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
24ab0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  ult code */.  un
24ac0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
24ad0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
24ae0 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64   The inode of fd
24af0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d   */.  char *zShm
24b00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24b10 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
24b20 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a  e used for SHM *
24b30 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65  /.  int nShmFile
24b40 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
24b50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
24b60 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20  he SHM filename 
24b70 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
24b80 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
24b90 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
24ba0 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  xShm object. */.
24bb0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
24bc0 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
24bd0 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
24be0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
24bf0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d  _NOMEM_BKPT;.  m
24c00 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
24c10 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72  of(*p));.  asser
24c20 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
24c30 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
24c40 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
24c50 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
24c60 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
24c70 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
24c80 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
24c90 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20  esent. Create a 
24ca0 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
24cb0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  sary..  */.  uni
24cc0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
24cd0 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
24ce0 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
24cf0 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
24d00 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
24d10 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
24d20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
24d30 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
24d40 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
24d50 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
24d60 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66   file */.#ifndef
24d70 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
24d80 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20  CTORY.    const 
24d90 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20  char *zBasePath 
24da0 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a  = pDbFd->zPath;.
24db0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
24dc0 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
24dd0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
24de0 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
24df0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
24e00 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
24e10 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
24e20 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
24e30 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
24e40 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
24e50 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
24e60 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
24e70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
24e80 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
24e90 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
24ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
24eb0 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67  R_FSTAT;.      g
24ec0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
24ed0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
24ee0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
24ef0 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c  TORY.    nShmFil
24f00 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53  ename = sizeof(S
24f10 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
24f20 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65  ORY) + 31;.#else
24f30 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
24f40 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72  e = 6 + (int)str
24f50 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a  len(zBasePath);.
24f60 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
24f70 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
24f80 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
24f90 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d  pShmNode) + nShm
24fa0 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Filename );.    
24fb0 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
24fc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
24fd0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
24fe0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
24ff0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
25000 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e      memset(pShmN
25010 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ode, 0, sizeof(*
25020 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69  pShmNode)+nShmFi
25030 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68  lename);.    zSh
25040 6d 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  m = pShmNode->zF
25050 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
25060 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23  )&pShmNode[1];.#
25070 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
25080 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73  _DIRECTORY.    s
25090 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
250a0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
250b0 68 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  hm, .           
250c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
250d0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22  _SHM_DIRECTORY "
250e0 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25  /sqlite-shm-%x-%
250f0 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
25100 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53           (u32)sS
25110 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32  tat.st_ino, (u32
25120 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a  )sStat.st_dev);.
25130 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65  #else.    sqlite
25140 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
25150 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 22  ilename, zShm, "
25160 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61  %s-shm", zBasePa
25170 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
25180 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
25190 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 29 3b  d->zPath, zShm);
251a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
251b0 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  Node->h = -1;.  
251c0 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d    pDbFd->pInode-
251d0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
251e0 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  Node;.    pShmNo
251f0 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62  de->pInode = pDb
25200 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20  Fd->pInode;.    
25210 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
25220 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
25230 65 78 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d  ex ){.      pShm
25240 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
25250 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
25260 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
25270 41 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20  AST);.      if( 
25280 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d  pShmNode->mutex=
25290 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
252a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
252b0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
252c0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
252d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
252e0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
252f0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
25300 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
25310 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
25320 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ean(pDbFd->zPath
25330 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22  , "readonly_shm"
25340 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
25350 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f  pShmNode->h = ro
25360 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20  bust_open(zShm, 
25370 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
25380 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30  (sStat.st_mode&0
25390 37 37 37 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  777));.      }. 
253a0 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
253b0 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
253c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
253d0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
253e0 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 28 73 53 74  , O_RDONLY, (sSt
253f0 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  at.st_mode&0777)
25400 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
25410 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a  ShmNode->h<0 ){.
25420 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
25430 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
25440 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
25450 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 29 3b  , "open", zShm);
25460 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
25470 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
25480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25490 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
254a0 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  only = 1;.      
254b0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
254c0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72  his process is r
254d0 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20  unning as root, 
254e0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
254f0 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20  he SHM file.    
25500 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79    ** is owned by
25510 20 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74   the same user t
25520 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69  hat owns the ori
25530 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20  ginal database. 
25540 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
25550 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
25560 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74  l owner will not
25570 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e   be able to conn
25580 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ect..      */.  
25590 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e      robustFchown
255a0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53  (pShmNode->h, sS
255b0 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61  tat.st_uid, sSta
255c0 74 2e 73 74 5f 67 69 64 29 3b 0a 0a 20 20 20 20  t.st_gid);..    
255d0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53    rc = unixLockS
255e0 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
255f0 64 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20  d, pShmNode);.  
25600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25610 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
25620 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
25630 54 49 4e 49 54 20 29 20 67 6f 74 6f 20 73 68 6d  TINIT ) goto shm
25640 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
25650 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
25660 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
25670 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68  on a child of th
25680 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
25690 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  .  p->pShmNode =
256a0 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65   pShmNode;.#ifde
256b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
256c0 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64   p->id = pShmNod
256d0 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a  e->nextShmId++;.
256e0 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64  #endif.  pShmNod
256f0 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62  e->nRef++;.  pDb
25700 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20  Fd->pShm = p;.  
25710 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
25720 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65  ;..  /* The refe
25730 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70  rence count on p
25740 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65  ShmNode has alre
25750 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65  ady been increme
25760 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20  nted under.  ** 
25770 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65  the cover of the
25780 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
25790 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
257a0 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
257b0 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
257c0 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63  t unixShm) objec
257d0 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64  t to the pShmNod
257e0 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  e has been set. 
257f0 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  All that is.  **
25800 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74   left to do is t
25810 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f  o link the new o
25820 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c  bject into the l
25830 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
25840 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d  ing.  ** at pShm
25850 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68  Node->pFirst. Th
25860 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
25870 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  while holding th
25880 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e pShmNode->mute
25890 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  x .  ** mutex.. 
258a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
258b0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
258c0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
258d0 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
258e0 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
258f0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
25900 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
25910 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
25920 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
25930 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75  urn rc;..  /* Ju
25940 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
25950 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
25960 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50  _err:.  unixShmP
25970 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20  urge(pDbFd);    
25980 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
25990 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69  frees pShmNode i
259a0 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
259b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
259c0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
259d0 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
259e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
259f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
25a00 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
25a10 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
25a20 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
25a30 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
25a40 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
25a50 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
25a60 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
25a70 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
25a80 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
25a90 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
25aa0 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
25ab0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
25ac0 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
25ad0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
25ae0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
25af0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
25b00 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
25b10 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
25b20 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
25b30 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
25b40 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65  bExtend paramete
25b50 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
25b60 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
25b70 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
25b80 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
25b90 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
25ba0 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
25bb0 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
25bc0 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
25bd0 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
25be0 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
25bf0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
25c00 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
25c10 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a  bExtend is non-z
25c20 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
25c30 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
25c40 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
25c50 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
25c60 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
25c70 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
25c80 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
25c90 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
25ca0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
25cb0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
25cc0 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
25cd0 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
25ce0 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
25cf0 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
25d00 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
25d10 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
25d20 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
25d30 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
25d40 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
25d50 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
25d60 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
25d70 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
25d80 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
25d90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
25da0 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73   unixShmMap(.  s
25db0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25dd0 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e  * Handle open on
25de0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
25df0 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c  /.  int iRegion,
25e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e10 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f      /* Region to
25e20 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69   retrieve */.  i
25e30 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20  nt szRegion,    
25e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e50 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e  * Size of region
25e60 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65  s */.  int bExte
25e70 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
25e80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
25e90 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66  o extend file if
25ea0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
25eb0 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
25ec0 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pp              
25ed0 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d  /* OUT: Mapped m
25ee0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e  emory */.){.  un
25ef0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
25f00 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
25f10 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75   unixShm *p;.  u
25f20 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
25f30 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
25f40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
25f50 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75  t nShmPerMap = u
25f60 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
25f70 61 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71  ap();.  int nReq
25f80 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66  Region;..  /* If
25f90 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
25fa0 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
25fb0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
25fc0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
25fd0 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
25fe0 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
25ff0 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
26000 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
26010 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26020 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26030 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
26040 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
26050 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
26060 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
26070 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
26080 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
26090 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e  ( pShmNode->isUn
260a0 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 72 63  locked ){.    rc
260b0 20 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65   = unixLockShare
260c0 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20 70  dMemory(pDbFd, p
260d0 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66  ShmNode);.    if
260e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
260f0 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
26100 75 74 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  ut;.    pShmNode
26110 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30  ->isUnlocked = 0
26120 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
26130 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
26140 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
26150 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
26160 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
26170 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
26180 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
26190 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
261a0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c  ShmNode->h>=0 ||
261b0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
261c0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20  bProcessLock==1 
261d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
261e0 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44  mNode->h<0 || pD
261f0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
26200 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
26210 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75  .  /* Minimum nu
26220 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20  mber of regions 
26230 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d  required to be m
26240 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71  apped. */.  nReq
26250 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69  Region = ((iRegi
26260 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f  on+nShmPerMap) /
26270 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e   nShmPerMap) * n
26280 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66  ShmPerMap;..  if
26290 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
262a0 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29  ion<nReqRegion )
262b0 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e  {.    char **apN
262c0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
262d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
262e0 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79  apRegion[] array
262f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
26300 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73  e = nReqRegion*s
26310 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69  zRegion;   /* Mi
26320 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
26330 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
26340 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
26350 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
26360 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73     /* Used by fs
26370 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53  tat() */..    pS
26380 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
26390 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20   = szRegion;..  
263a0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
263b0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  h>=0 ){.      /*
263c0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72   The requested r
263d0 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70  egion is not map
263e0 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
263f0 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
26400 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20  space..      ** 
26410 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
26420 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
26430 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
26440 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
26450 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61  e is.      ** la
26460 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  rge enough to co
26470 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73  ntain the reques
26480 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20  ted region)..   
26490 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
264a0 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65  osFstat(pShmNode
264b0 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ->h, &sStat) ){.
264c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
264d0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
264e0 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  E;.        goto 
264f0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
26500 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66     }.  .      if
26510 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c  ( sStat.st_size<
26520 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
26530 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
26540 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
26550 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
26560 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65  If bExtend is se
26570 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  t to.        ** 
26580 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c  false, exit earl
26590 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
265a0 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
265b0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
265c0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
265d0 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65        if( !bExte
265e0 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
265f0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
26600 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
26610 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
26620 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e  ively, if bExten
26630 64 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e  d is true, exten
26640 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74  d the file. Do t
26650 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a  his by.        *
26660 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67  * writing a sing
26670 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65  le byte to the e
26680 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20  nd of each (OS) 
26690 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20  page being.     
266a0 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
266b0 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63  or extended. Tec
266c0 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65  hnically, we nee
266d0 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20  d only write to 
266e0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  the.        ** l
266f0 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65  ast page in orde
26700 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  r to extend the 
26710 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e  file. But writin
26720 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20  g to all new.   
26730 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f       ** pages fo
26740 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61  rces the OS to a
26750 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d  llocate them imm
26760 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20  ediately, which 
26770 72 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20  reduces.        
26780 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f  ** the chances o
26790 66 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61  f SIGBUS while a
267a0 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70  ccessing the map
267b0 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72  ped region later
267c0 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a   on..        */.
267d0 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20          else{.  
267e0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
267f0 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
26800 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20  4096;.          
26810 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20  int iPg;..      
26820 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
26830 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
26840 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f   each newly allo
26850 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
26860 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
26870 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79      assert( (nBy
26880 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b  te % pgsz)==0 );
26890 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
268a0 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a  Pg=(sStat.st_siz
268b0 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42  e/pgsz); iPg<(nB
268c0 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b  yte/pgsz); iPg++
268d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
268e0 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt x = 0;.      
268f0 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e        if( seekAn
26900 64 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64  dWriteFd(pShmNod
26910 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b  e->h, iPg*pgsz +
26920 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20   pgsz-1, "", 1, 
26930 26 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  &x)!=1 ){.      
26940 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
26950 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d  ar *zFile = pShm
26960 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  Node->zFilename;
26970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
26980 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
26990 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
269a0 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20  MSIZE, "write", 
269b0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
269c0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
269d0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
269e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
269f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26a00 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
26a10 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
26a20 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
26a30 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
26a40 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
26a50 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
26a60 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c  w = (char **)sql
26a70 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
26a80 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
26a90 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65  apRegion, nReqRe
26aa0 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72  gion*sizeof(char
26ab0 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   *).    );.    i
26ac0 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
26ad0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
26ae0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
26af0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
26b00 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
26b10 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
26b20 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20  egion = apNew;. 
26b30 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f     while( pShmNo
26b40 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71  de->nRegion<nReq
26b50 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
26b60 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67  int nMap = szReg
26b70 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a  ion*nShmPerMap;.
26b80 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
26b90 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20     void *pMem;. 
26ba0 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
26bb0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
26bc0 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70     pMem = osMmap
26bd0 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20  (0, nMap,.      
26be0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
26bf0 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f  isReadonly ? PRO
26c00 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45  T_READ : PROT_RE
26c10 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a  AD|PROT_WRITE, .
26c20 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f              MAP_
26c30 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65  SHARED, pShmNode
26c40 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69  ->h, szRegion*(i
26c50 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  64)pShmNode->nRe
26c60 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a  gion.        );.
26c70 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
26c80 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
26c90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
26ca0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
26cb0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
26cc0 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64   "mmap", pShmNod
26cd0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
26ce0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
26cf0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
26d00 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
26d10 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  {.        pMem =
26d20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
26d30 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  4(szRegion);.   
26d40 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30       if( pMem==0
26d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
26d60 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
26d70 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
26d80 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
26d90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26da0 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c      memset(pMem,
26db0 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   0, szRegion);. 
26dc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
26dd0 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72  r(i=0; i<nShmPer
26de0 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Map; i++){.     
26df0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
26e00 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
26e10 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28  nRegion+i] = &((
26e20 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65  char*)pMem)[szRe
26e30 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d  gion*i];.      }
26e40 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
26e50 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d  >nRegion += nShm
26e60 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20  PerMap;.    }.  
26e70 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
26e80 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
26e90 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
26ea0 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68  ){.    *pp = pSh
26eb0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
26ec0 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73  iRegion];.  }els
26ed0 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
26ee0 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f    }.  if( pShmNo
26ef0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26  de->isReadonly &
26f00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
26f10 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45  ) rc = SQLITE_RE
26f20 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65  ADONLY;.  sqlite
26f30 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
26f40 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
26f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26f60 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
26f70 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
26f80 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
26f90 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  segment..**.** N
26fa0 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c  ote that the rel
26fb0 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
26fc0 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43  n SHAREd and EXC
26fd0 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20  LUSIVE locks is 
26fe0 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66  a little.** diff
26ff0 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20  erent here than 
27000 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53  in posix.  In xS
27010 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61  hmLock(), one ca
27020 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  n go from unlock
27030 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20  ed.** to shared 
27040 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d  and back or from
27050 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63   unlocked to exc
27060 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e  lusive and back.
27070 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a    But one may.**
27080 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61   not go from sha
27090 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  red to exclusive
270a0 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69   or from exclusi
270b0 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f  ve to shared..*/
270c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
270d0 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74  ShmLock(.  sqlit
270e0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
270f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
27100 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
27110 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
27120 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
27130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27140 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74   /* First lock t
27150 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
27160 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c  ease */.  int n,
27170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27180 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27190 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69  f locks to acqui
271a0 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
271b0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
271c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
271d0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
271e0 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a   the lock */.){.
271f0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
27200 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
27210 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  d;      /* Conne
27220 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68  ction holding sh
27230 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
27240 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44   unixShm *p = pD
27250 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
27260 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
27270 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e  ared memory bein
27280 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  g locked */.  un
27290 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  ixShm *pX;      
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
272c0 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c  ng over all sibl
272d0 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ings */.  unixSh
272e0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
272f0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20  = p->pShmNode;  
27300 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
27310 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a  g file iNode */.
27320 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
27330 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
27340 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
27350 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
27360 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
27370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27380 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
27390 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
273a0 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
273b0 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
273c0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
273d0 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
273e0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
273f0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
27400 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
27410 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
27420 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
27430 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
27440 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
27450 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
27460 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
27470 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
27480 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
27490 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
274a0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
274b0 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
274c0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
274d0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
274e0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
274f0 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
27500 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
27510 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
27520 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
27530 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
27540 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
27550 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
27560 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)!=0 );.  asser
27570 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  t( pShmNode->h>=
27580 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
27590 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
275a0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
275b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c   pShmNode->h<0 |
275c0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
275d0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
275e0 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31   );..  mask = (1
275f0 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
27600 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72  <<ofst);.  asser
27610 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d  t( n>1 || mask==
27620 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73  (1<<ofst) );.  s
27630 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
27640 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
27650 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ex);.  if( flags
27660 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e   & SQLITE_SHM_UN
27670 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20  LOCK ){.    u16 
27680 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20  allMask = 0; /* 
27690 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65  Mask of locks he
276a0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a  ld by siblings *
276b0 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66  /..    /* See if
276c0 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f   any siblings ho
276d0 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63  ld this same loc
276e0 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d  k */.    for(pX=
276f0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
27700 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
27710 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
27720 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==p ) continue;
27730 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
27740 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28  pX->exclMask & (
27750 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73  p->exclMask|p->s
27760 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29  haredMask))==0 )
27770 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20  ;.      allMask 
27780 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
27790 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
277a0 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74   Unlock the syst
277b0 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a  em-level locks *
277c0 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20  /.    if( (mask 
277d0 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b  & allMask)==0 ){
277e0 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
277f0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
27800 62 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66  bFd, F_UNLCK, of
27810 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
27820 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
27830 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
27840 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
27850 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
27860 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
27870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27880 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
27890 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
278a0 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
278b0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
278c0 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
278d0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
278e0 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
278f0 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
27900 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
27910 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
27920 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
27930 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
27940 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
27950 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
27960 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
27970 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
27980 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
27990 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
279a0 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
279b0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
279c0 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
279d0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
279e0 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
279f0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
27a00 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
27a10 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
27a20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
27a30 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
27a40 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
27a50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
27a60 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
27a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27a80 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
27a90 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
27aa0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
27ab0 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
27ac0 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
27ad0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
27ae0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
27af0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27b00 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
27b10 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
27b20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
27b30 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46  mSystemLock(pDbF
27b40 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  d, F_RDLCK, ofst
27b50 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
27b60 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
27b70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
27b80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
27b90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
27ba0 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
27bb0 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
27bc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27bd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
27be0 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
27bf0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
27c00 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
27c10 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
27c20 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
27c30 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
27c40 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
27c50 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
27c60 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
27c70 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
27c80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
27c90 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
27ca0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
27cb0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
27cc0 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
27cd0 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
27ce0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
27cf0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
27d00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27d10 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
27d20 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
27d30 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
27d40 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
27d50 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
27d60 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
27d70 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
27d80 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
27d90 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
27da0 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
27db0 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
27dc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27dd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
27de0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
27df0 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43  ck(pDbFd, F_WRLC
27e00 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
27e10 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
27e20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27e30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
27e40 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64  sert( (p->shared
27e50 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
27e60 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  );.        p->ex
27e70 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
27e80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27e90 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
27ea0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
27eb0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ->mutex);.  OSTR
27ec0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73  ACE(("SHM-LOCK s
27ed0 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20  hmid-%d, pid-%d 
27ee0 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  got %03x,%03x\n"
27ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
27f00 69 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c  id, osGetpid(0),
27f10 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
27f20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  p->exclMask));. 
27f30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27f40 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
27f50 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
27f60 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
27f70 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
27f80 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  .  .**.** All lo
27f90 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
27fa0 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
27fb0 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
27fc0 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
27fd0 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
27fe0 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
27ff0 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
28000 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
28010 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
28020 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
28030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
28040 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
28050 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
28060 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
28070 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28080 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65  fd);.  sqlite3Me
28090 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20  moryBarrier();  
280a0 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c         /* compil
280b0 65 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72  er-defined memor
280c0 79 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 75  y barrier */.  u
280d0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
280f0 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f  * Also mutex, fo
28100 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a  r redundancy */.
28110 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
28120 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ();.}../*.** Clo
28130 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
28140 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
28150 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
28160 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
28170 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
28180 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
28190 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
281a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
281b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
281c0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  he connection th
281d0 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
281e0 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
281f0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
28200 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d  c int unixShmUnm
28210 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
28220 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
28230 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
28240 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
28250 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   file */.  int d
28260 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
28270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
28280 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f  lete shared-memo
28290 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ry if true */.){
282a0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20  .  unixShm *p;  
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282c0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
282d0 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
282e0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  d */.  unixShmNo
282f0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
28300 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
28310 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
28320 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
28330 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20   unixShm **pp;  
28340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28350 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
28360 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
28370 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e  nections */.  un
28380 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  ixFile *pDbFd;  
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283a0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
283b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
283c0 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69  ..  pDbFd = (uni
283d0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  xFile*)fd;.  p =
283e0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
283f0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
28400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
28410 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
28420 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74  mNode;..  assert
28430 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
28440 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
28450 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
28460 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
28470 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
28480 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
28490 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
284a0 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
284b0 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
284c0 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
284d0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
284e0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
284f0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
28500 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
28510 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
28520 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
28530 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
28540 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
28550 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
28560 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
28570 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
28580 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
28590 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
285a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
285b0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
285c0 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
285d0 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
285e0 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
285f0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
28600 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
28610 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
28620 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
28630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
28640 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
28650 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
28660 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
28670 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
28680 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
28690 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e  ag && pShmNode->
286a0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  h>=0 ){.      os
286b0 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
286c0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
286d0 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75   }.    unixShmPu
286e0 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a  rge(pDbFd);.  }.
286f0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
28700 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
28710 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c  LITE_OK;.}...#el
28720 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
28730 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
28740 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63  efine unixShmLoc
28750 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
28760 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30  unixShmBarrier 0
28770 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
28780 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
28790 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
287a0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
287b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
287c0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
287d0 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65  * If it is curre
287e0 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70  ntly memory mapp
287f0 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70  ed, unmap file p
28800 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Fd..*/.static vo
28810 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
28820 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
28830 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
28840 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
28850 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
28860 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d  egion ){.    osM
28870 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52  unmap(pFd->pMapR
28880 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70  egion, pFd->mmap
28890 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20  SizeActual);.   
288a0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
288b0 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
288c0 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
288d0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
288e0 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  tual = 0;.  }.}.
288f0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
28900 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f  o set the size o
28910 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  f the memory map
28920 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20  ping maintained 
28930 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63  by file .** desc
28940 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e  riptor pFd to nN
28950 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78  ew bytes. Any ex
28960 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
28970 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a  s discarded..**.
28980 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
28990 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
289a0 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sets the followi
289b0 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a  ng variables:.**
289c0 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
289d0 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a  le.pMapRegion.**
289e0 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
289f0 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20  mmapSize.**     
28a00 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
28a10 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20  izeActual.**.** 
28a20 49 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  If unsuccessful,
28a30 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
28a40 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20  e is logged via 
28a50 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e  sqlite3_log() an
28a60 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76  d.** the three v
28a70 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61  ariables above a
28a80 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68  re zeroed. In th
28a90 69 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73  is case SQLite s
28aa0 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75  hould.** continu
28ab0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
28ac0 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
28ad0 68 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78  he xRead() and x
28ae0 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f  Write().** metho
28af0 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
28b00 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65  id unixRemapfile
28b10 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
28b20 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
28b30 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
28b40 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  riptor object */
28b50 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20  .  i64 nNew     
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d     /* Required m
28b80 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29  apping size */.)
28b90 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
28ba0 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20  zErr = "mmap";. 
28bb0 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b   int h = pFd->h;
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bd0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
28be0 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
28bf0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38   db file */.  u8
28c00 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29   *pOrig = (u8 *)
28c10 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b  pFd->pMapRegion;
28c20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
28c30 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61   current file ma
28c40 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e  pping */.  i64 n
28c50 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  Orig = pFd->mmap
28c60 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
28c70 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67  /* Size of pOrig
28c80 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73   region in bytes
28c90 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d   */.  u8 *pNew =
28ca0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
28cc0 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61  cation of new ma
28cd0 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66  pping */.  int f
28ce0 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44  lags = PROT_READ
28cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28d00 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
28d10 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20   to mmap() */.. 
28d20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
28d30 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
28d40 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64  assert( nNew>pFd
28d50 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
28d60 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46  assert( nNew<=pF
28d70 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
28d80 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
28d90 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
28da0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
28db0 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  ual>=pFd->mmapSi
28dc0 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
28dd0 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b  MAP_FAILED!=0 );
28de0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
28df0 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20  MMAP_READWRITE. 
28e00 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
28e10 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
28e20 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61  RDONLY)==0 ) fla
28e30 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45  gs |= PROT_WRITE
28e40 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
28e50 70 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56  pOrig ){.#if HAV
28e60 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34  E_MREMAP.    i64
28e70 20 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d   nReuse = pFd->m
28e80 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20  mapSize;.#else. 
28e90 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53     const int szS
28ea0 79 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61  yspage = osGetpa
28eb0 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36  gesize();.    i6
28ec0 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d  4 nReuse = (pFd-
28ed0 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a  >mmapSize & ~(sz
28ee0 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e  Syspage-1));.#en
28ef0 64 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71  dif.    u8 *pReq
28f00 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65   = &pOrig[nReuse
28f10 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70  ];..    /* Unmap
28f20 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68   any pages of th
28f30 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
28f40 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ng that cannot b
28f50 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20  e reused. */.   
28f60 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72   if( nReuse!=nOr
28f70 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  ig ){.      osMu
28f80 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67  nmap(pReq, nOrig
28f90 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a  -nReuse);.    }.
28fa0 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
28fb0 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72  .    pNew = osMr
28fc0 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  emap(pOrig, nReu
28fd0 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50  se, nNew, MREMAP
28fe0 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a  _MAYMOVE);.    z
28ff0 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a  Err = "mremap";.
29000 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
29010 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e   osMmap(pReq, nN
29020 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73  ew-nReuse, flags
29030 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
29040 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66   nReuse);.    if
29050 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c  ( pNew!=MAP_FAIL
29060 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ED ){.      if( 
29070 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20  pNew!=pReq ){.  
29080 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
29090 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75  New, nNew - nReu
290a0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  se);.        pNe
290b0 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  w = 0;.      }el
290c0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
290d0 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20   = pOrig;.      
290e0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
290f0 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d      /* The attem
29100 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  pt to extend the
29110 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
29120 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69  g failed. Free i
29130 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e  t. */.    if( pN
29140 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c  ew==MAP_FAILED |
29150 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  | pNew==0 ){.   
29160 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69     osMunmap(pOri
29170 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  g, nReuse);.    
29180 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
29190 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c  New is still NUL
291a0 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  L, try to create
291b0 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77   an entirely new
291c0 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69   mapping. */.  i
291d0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
291e0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28    pNew = osMmap(
291f0 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20  0, nNew, flags, 
29200 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30  MAP_SHARED, h, 0
29210 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  );.  }..  if( pN
29220 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew==MAP_FAILED )
29230 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  {.    pNew = 0;.
29240 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20      nNew = 0;.  
29250 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53    unixLogError(S
29260 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20  QLITE_OK, zErr, 
29270 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20  pFd->zPath);..  
29280 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70    /* If the mmap
29290 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c  () above failed,
292a0 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c   assume that all
292b0 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70   subsequent mmap
292c0 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20  () calls.    ** 
292d0 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61  will probably fa
292e0 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63  il too. Fall bac
292f0 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64  k to using xRead
29300 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76  /xWrite exclusiv
29310 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ely.    ** in th
29320 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
29330 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
29340 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64  x = 0;.  }.  pFd
29350 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28  ->pMapRegion = (
29360 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70  void *)pNew;.  p
29370 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
29380 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
29390 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a  al = nNew;.}../*
293a0 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
293b0 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
293c0 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
293d0 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
293e0 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
293f0 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
29400 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
29410 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
29420 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
29430 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
29440 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
29450 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
29460 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
29470 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
29480 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
29490 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
294a0 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
294b0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
294c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
294d0 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
294e0 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
294f0 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
29500 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
29510 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
29520 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
29530 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
29540 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
29550 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
29560 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
29570 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
29580 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
29590 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
295a0 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
295b0 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
295c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
295d0 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
295e0 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
295f0 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
29600 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68  L_MMAP_LIMIT, wh
29610 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
29620 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
29630 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
29640 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
29650 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20  rs (even if the 
29660 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a  mapping is not.*
29670 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61  * recreated as a
29680 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74   result of outst
29690 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
296a0 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s) or an SQLite 
296b0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
296c0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
296d0 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
296e0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
296f0 2c 20 69 36 34 20 6e 4d 61 70 29 7b 0a 20 20 61  , i64 nMap){.  a
29700 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
29710 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
29720 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29730 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d   nMap>0 || (pFd-
29740 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20  >mmapSize==0 && 
29750 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
29760 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 46 64  =0) );.  if( pFd
29770 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
29780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29790 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
297a0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
297b0 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
297c0 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
297d0 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
297e0 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73  on */.    if( os
297f0 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73  Fstat(pFd->h, &s
29800 74 61 74 62 75 66 29 20 29 7b 0a 20 20 20 20 20  tatbuf) ){.     
29810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
29820 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
29830 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61  }.    nMap = sta
29840 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20  tbuf.st_size;.  
29850 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64  }.  if( nMap>pFd
29860 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b  ->mmapSizeMax ){
29870 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d  .    nMap = pFd-
29880 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
29890 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  }..  assert( nMa
298a0 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61  p>0 || (pFd->mma
298b0 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d  pSize==0 && pFd-
298c0 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20  >pMapRegion==0) 
298d0 29 3b 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70  );.  if( nMap!=p
298e0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
298f0 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c      unixRemapfil
29900 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20  e(pFd, nMap);.  
29910 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
29920 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
29930 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
29940 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
29950 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  .** If possible,
29960 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
29970 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f  r to a mapping o
29980 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69  f file fd starti
29990 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ng at offset.** 
299a0 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e  iOff. The mappin
299b0 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20  g must be valid 
299c0 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d  for at least nAm
299d0 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  t bytes..**.** I
299e0 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72  f such a pointer
299f0 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
29a00 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70  , store it in *p
29a10 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  p and return SQL
29a20 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69  ITE_OK..** Or, i
29a30 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74  f one cannot but
29a40 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
29a50 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61  , set *pp to 0 a
29a60 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
29a70 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  _OK..** Finally,
29a80 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
29a90 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20  s occur, return 
29aa0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
29ab0 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a  code. The final.
29ac0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20  ** value of *pp 
29ad0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
29ae0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
29af0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
29b00 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20  n does return a 
29b10 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c  pointer, the cal
29b20 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61  ler must eventua
29b30 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20  lly .** release 
29b40 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79  the reference by
29b50 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66   calling unixUnf
29b60 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  etch()..*/.stati
29b70 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63 68 28  c int unixFetch(
29b80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
29b90 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
29ba0 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
29bb0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
29bc0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
29bd0 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
29be0 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
29bf0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
29c00 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
29c10 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
29c20 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54   = 0;..#if SQLIT
29c30 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
29c40 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61  0.  if( pFd->mma
29c50 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20  pSizeMax>0 ){.  
29c60 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
29c70 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  egion==0 ){.    
29c80 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d    int rc = unixM
29c90 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b  apfile(pFd, -1);
29ca0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
29cb0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
29cc0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
29cd0 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
29ce0 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29  e >= iOff+nAmt )
29cf0 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28  {.      *pp = &(
29d00 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
29d10 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20  egion)[iOff];.  
29d20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
29d30 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ut++;.    }.  }.
29d40 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
29d50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
29d60 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64  .** If the third
29d70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
29d80 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73  -NULL, then this
29d90 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73   function releas
29da0 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e  es a .** referen
29db0 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61  ce obtained by a
29dc0 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
29dd0 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54  o unixFetch(). T
29de0 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
29df0 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
29e00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
29e10 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
29e20 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
29e30 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
29e40 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
29e50 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74 63 68  to the unixFetch
29e60 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a  () invocation. .
29e70 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
29e80 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
29e90 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
29ea0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
29eb0 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  eing called .** 
29ec0 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46  to inform the VF
29ed0 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63  S layer that, ac
29ee0 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58  cording to POSIX
29ef0 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  , any existing m
29f00 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e  apping .** may n
29f10 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e  ow be invalid an
29f20 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61  d should be unma
29f30 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
29f40 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28  int unixUnfetch(
29f50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
29f60 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64  , i64 iOff, void
29f70 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45   *p){.#if SQLITE
29f80 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
29f90 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
29fa0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66   = (unixFile *)f
29fb0 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
29fc0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
29fd0 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44  file */.  UNUSED
29fe0 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29  _PARAMETER(iOff)
29ff0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20  ;..  /* If p==0 
2a000 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72  (unmap the entir
2a010 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65  e file) then the
2a020 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75  re must be no ou
2a030 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
2a040 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
2a050 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28  s. Or, if p!=0 (
2a060 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e  meaning it is an
2a070 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
2a080 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  e),.  ** then th
2a090 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
2a0a0 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
2a0b0 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ding.  */.  asse
2a0c0 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64  rt( (p==0)==(pFd
2a0d0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20  ->nFetchOut==0) 
2a0e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30  );..  /* If p!=0
2a0f0 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20  , it must match 
2a100 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20  the iOff value. 
2a110 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  */.  assert( p==
2a120 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29  0 || p==&((u8 *)
2a130 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
2a140 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28  [iOff] );..  if(
2a150 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e   p ){.    pFd->n
2a160 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65  FetchOut--;.  }e
2a170 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d  lse{.    unixUnm
2a180 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
2a190 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
2a1a0 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
2a1b0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
2a1c0 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
2a1d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a1e0 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
2a1f0 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a  ARAMETER(iOff);.
2a200 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2a210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2a220 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
2a230 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2a240 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
2a250 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
2a260 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2a270 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
2a280 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
2a290 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2a2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2b0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2a2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2a300 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  ../*.** This div
2a310 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64  ision contains d
2a320 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
2a330 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a340 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a   objects that.**
2a350 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
2a360 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  us file locking 
2a370 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20  strategies.  It 
2a380 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65  also contains de
2a390 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  finitions.** of 
2a3a0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
2a3b0 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75  ns.  A finder-fu
2a3c0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2a3d0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70  o locate the app
2a3e0 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69  ropriate.** sqli
2a3f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2a400 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74  bject for a part
2a410 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
2a420 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44  file.  The pAppD
2a430 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  ata.** field of 
2a440 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20  the sqlite3_vfs 
2a450 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20  VFS objects are 
2a460 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62  initialized to b
2a470 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  e pointers to.**
2a480 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e   the correct fin
2a490 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der-function for
2a4a0 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a   that VFS..**.**
2a4b0 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e   Most finder fun
2a4c0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20  ctions return a 
2a4d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
2a4e0 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
2a4f0 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e  thods.** object.
2a500 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72    The only inter
2a510 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75  esting finder-fu
2a520 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f  nction is autolo
2a530 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63  ckIoFinder, whic
2a540 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68  h.** looks at th
2a550 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
2a560 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67  e and tries to g
2a570 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f  uess the best lo
2a580 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67  cking.** strateg
2a590 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a  y from that..**.
2a5a0 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75  ** For finder-fu
2a5b0 6e 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62  nction F, two ob
2a5c0 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
2a5d0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  d:.**.**    (1) 
2a5e0 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d  The real finder-
2a5f0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
2a600 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20  FImpt()"..**.** 
2a610 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e     (2) A constan
2a620 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  t pointer to thi
2a630 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  s function named
2a640 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a   just "F"..**.**
2a650 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
2a660 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69   the F pointer i
2a670 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41  s used as the pA
2a680 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72  ppData value for
2a690 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e   VFS.** objects.
2a6a0 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
2a6b0 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20  this instead of 
2a6c0 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61  letting pAppData
2a6d0 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74   point.** direct
2a6e0 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72  ly at the finder
2a6f0 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20  -function since 
2a700 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e  C90 rules preven
2a710 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f  t a void*.** fro
2a720 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61  m be cast into a
2a730 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
2a740 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  r..**.**.** Each
2a750 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
2a760 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
2a770 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
2a780 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
2a790 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
2a7a0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
2a7b0 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
2a7c0 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
2a7d0 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
2a7e0 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
2a7f0 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
2a800 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
2a810 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
2a820 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
2a830 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
2a840 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
2a850 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
2a860 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
2a870 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
2a880 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
2a890 4f 44 53 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f  ODS(FINDER,METHO
2a8a0 44 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c  D,VERSION,CLOSE,
2a8b0 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f  LOCK,UNLOCK,CKLO
2a8c0 43 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20 20 5c  CK,SHMMAP)     \
2a8d0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2a8e0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a8f0 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
2a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2a920 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20     VERSION,     
2a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a940 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
2a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2a970 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
2a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a990 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
2a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2a9c0 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
2a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a9e0 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa00 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2aa10 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2aa30 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
2aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa50 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2aa60 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
2aa70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
2aa80 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaa0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2aab0 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
2aac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
2aad0 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaf0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2ab00 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
2ab10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
2ab20 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab40 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
2ab50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ab60 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
2ab70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab90 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
2aba0 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
2abb0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2abc0 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abe0 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
2abf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ac00 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
2ac10 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
2ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac30 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
2ac40 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
2ac50 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
2ac60 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac80 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
2ac90 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
2aca0 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
2acb0 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
2acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acd0 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
2ace0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2acf0 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70  ,  /* xDeviceCap
2ad00 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad20 20 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20 20   \.   SHMMAP,   
2ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad40 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20    /* xShmMap */ 
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad70 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  \.   unixShmLock
2ad80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ad90 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20   /* xShmLock */ 
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2adc0 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69  .   unixShmBarri
2add0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
2ade0 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
2adf0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2ae10 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c     unixShmUnmap,
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ae30 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20  * xShmUnmap */  
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2ae60 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20 20    unixFetch,    
2ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae80 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20 20   xFetch */      
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2aeb0 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20 20   unixUnfetch,   
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aed0 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20 20  xUnfetch */     
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aef0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
2af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af40 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
2af50 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2af60 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
2af70 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
2af80 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
2af90 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
2afa0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
2afb0 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
2afc0 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
2aff0 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
2b000 20 20 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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b030 20 20 20 20 20 20 20 5c 0a 7d 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 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b080 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
2b090 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2b0a0 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
2b0b0 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
2b0c0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
2b0d0 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
2b0e0 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
2b0f0 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
2b100 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
2b110 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
2b120 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
2b130 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
2b140 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
2b150 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
2b160 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
2b170 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
2b180 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
2b190 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
2b1a0 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
2b1b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2b1c0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2b1d0 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
2b1e0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2b1f0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2b200 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2b210 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20   */.  3,        
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2b240 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e   and mmap are en
2b250 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
2b260 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2b270 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2b280 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
2b290 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2b2a0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2b2b0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
2b2c0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2b2d0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2b2e0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
2b2f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2b300 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ,    /* xCheckRe
2b310 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2b320 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61  d */.  unixShmMa
2b330 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
2b340 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2b350 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
2b360 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e  S(.  nolockIoFin
2b370 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  der,           /
2b380 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2b390 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  n name */.  nolo
2b3a0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
2b3b0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2b3c0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2b3d0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3f0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2b400 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70   memory and mmap
2b410 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   are enabled */.
2b420 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20    nolockClose,  
2b430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b440 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2b450 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20    nolockLock,   
2b460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b470 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2b480 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20   nolockUnlock,  
2b490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2b4a0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2b4b0 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73    nolockCheckRes
2b4c0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78  ervedLock,  /* x
2b4d0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b4e0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b500 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2b510 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ap method */.).I
2b520 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
2b530 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
2b540 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2b550 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2b560 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
2b570 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
2b580 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2b590 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2b5a0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b5c0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2b5d0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2b5e0 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
2b5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2b600 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2b610 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
2b620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2b630 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
2b640 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
2b650 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2b660 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2b670 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
2b680 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68  rvedLock, /* xCh
2b690 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2b6a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6c0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2b6d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69   method */.)..#i
2b6e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2b6f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
2b700 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b  METHODS(.  flock
2b710 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2b720 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2b730 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2b740 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73    flockIoMethods
2b750 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
2b760 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b770 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2b780 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2b790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b7a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2b7b0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66   disabled */.  f
2b7c0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
2b7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2b7e0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  se method */.  f
2b7f0 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
2b800 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2b810 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
2b820 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
2b830 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
2b840 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
2b850 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
2b860 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65  dLock,   /* xChe
2b870 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2b880 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8a0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
2b8b0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
2b8c0 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  if..#if OS_VXWOR
2b8d0 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
2b8e0 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  semIoFinder,    
2b8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2b900 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2b910 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68  e */.  semIoMeth
2b920 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
2b930 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2b940 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2b950 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b970 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2b980 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2b990 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20  /.  semXClose,  
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b9b0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2b9c0 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20  /.  semXLock,   
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b9e0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2b9f0 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20  .  semXUnlock,  
2ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ba10 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2ba20 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73  /.  semXCheckRes
2ba30 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a  ervedLock,    /*
2ba40 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2ba50 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2ba60 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2ba70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2ba80 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2ba90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
2baa0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2bab0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2bac0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
2bad0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
2bae0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2baf0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2bb00 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2bb10 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bb30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2bb40 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2bb50 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb70 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2bb80 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2bb90 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  afpClose,       
2bba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2bbb0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2bbc0 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  afpLock,        
2bbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2bbe0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
2bbf0 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fpUnlock,       
2bc00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2bc10 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2bc20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
2bc30 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68  Lock,     /* xCh
2bc40 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2bc50 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc70 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2bc80 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2bc90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
2bca0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  roxy locking met
2bcb0 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d  hod is a "super-
2bcc0 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73  method" in the s
2bcd0 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20  ense that it.** 
2bce0 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20  opens secondary 
2bcf0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2bd00 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61   for the conch a
2bd10 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e  nd lock files an
2bd20 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f  d.** it uses pro
2bd30 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46  xy, dot-file, AF
2bd40 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c  P, and flock() l
2bd50 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
2bd60 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e  n those.** secon
2bd70 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72  dary files.  For
2bd80 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
2bd90 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
2bda0 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72  implements.** pr
2bdb0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  oxy locking is l
2bdc0 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74  ocated much furt
2bdd0 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  her down in the 
2bde0 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65  file.  But we ne
2bdf0 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  ed.** to go ahea
2be00 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65  d and define the
2be10 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2be20 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66  ods and finder f
2be30 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70  unction.** for p
2be40 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72  roxy locking her
2be50 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72  e.  So we forwar
2be60 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f  d declare the I/
2be70 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69  O methods..*/.#i
2be80 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2be90 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2bea0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2beb0 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70  YLE.static int p
2bec0 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
2bed0 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
2bee0 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73   int proxyLock(s
2bef0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
2bf00 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
2bf10 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
2bf20 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
2bf30 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2bf40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2bf50 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
2bf60 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44   int*);.IOMETHOD
2bf70 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  S(.  proxyIoFind
2bf80 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
2bf90 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2bfa0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78  n name */.  prox
2bfb0 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  yIoMethods,     
2bfc0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2bfd0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2bfe0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c000 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2c010 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2c020 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  led */.  proxyCl
2c030 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2c040 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2c050 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
2c060 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2c070 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2c080 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
2c090 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2c0a0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2c0b0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
2c0c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2c0d0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2c0e0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2c0f0 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c110 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2c120 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
2c130 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53   nfs lockd on OS
2c140 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20  X 10.3+ doesn't 
2c150 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b  clear write lock
2c160 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  s when a read lo
2c170 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66  ck is set */.#if
2c180 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2c190 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2c1a0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2c1b0 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
2c1c0 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  nfsIoFinder,    
2c1d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2c1e0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2c1f0 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74  me */.  nfsIoMet
2c200 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
2c210 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2c220 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2c230 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c250 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2c260 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2c270 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
2c280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c290 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2c2a0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
2c2b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c2c0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2c2d0 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63  od */.  nfsUnloc
2c2e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2c2f0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
2c300 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
2c310 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2c320 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
2c330 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2c340 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c360 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
2c370 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
2c380 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2c390 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2c3a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2c3b0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
2c3c0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
2c3d0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
2c3e0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
2c3f0 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
2c400 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
2c410 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
2c420 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
2c430 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
2c440 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2c450 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
2c460 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
2c470 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
2c480 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
2c490 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
2c4a0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2c4b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
2c4c0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
2c4d0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
2c4e0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
2c4f0 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
2c500 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2c510 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2c520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
2c530 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
2c540 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2c550 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
2c560 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2c570 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
2c580 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2c590 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
2c5a0 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
2c5b0 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
2c5c0 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
2c5d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
2c5e0 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
2c5f0 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
2c600 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
2c610 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
2c620 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
2c630 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2c640 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
2c650 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
2c660 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
2c670 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
2c680 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
2c690 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
2c6a0 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
2c6b0 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
2c6c0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
2c6d0 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
2c6e0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
2c6f0 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
2c700 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
2c710 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
2c720 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
2c730 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
2c740 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
2c750 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2c760 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
2c770 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
2c780 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
2c790 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
2c7a0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2c7b0 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
2c7c0 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
2c7d0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
2c7e0 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
2c7f0 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
2c800 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
2c810 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2c820 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
2c830 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
2c840 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
2c850 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2c860 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
2c870 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
2c880 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
2c890 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
2c8a0 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
2c8b0 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
2c8c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2c8d0 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
2c8e0 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
2c8f0 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
2c900 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
2c910 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
2c920 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
2c930 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
2c940 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
2c950 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2c960 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
2c970 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
2c980 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
2c990 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
2c9a0 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
2c9b0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
2c9c0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
2c9d0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
2c9e0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
2c9f0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
2ca00 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
2ca10 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
2ca20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
2ca30 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2ca40 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
2ca50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2ca60 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
2ca70 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2ca80 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
2ca90 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
2caa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2cab0 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
2cac0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2cad0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2cae0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2caf0 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
2cb00 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
2cb10 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
2cb20 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
2cb30 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
2cb40 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
2cb50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2cb60 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2cb70 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
2cb80 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54  _VXWORKS./*.** T
2cb90 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
2cba0 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b  ction for VxWork
2cbb0 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  s checks to see 
2cbc0 69 66 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  if posix advisor
2cbd0 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  y.** locking wor
2cbe0 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ks.  If it does,
2cbf0 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 77 68   then that is wh
2cc00 61 74 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  at is used.  If 
2cc10 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77  it does not.** w
2cc20 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61  ork, then fallba
2cc30 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61  ck to named sema
2cc40 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  phore locking..*
2cc50 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2cc60 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2cc70 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64  s *vxworksIoFind
2cc80 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
2cc90 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
2cca0 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
2ccb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ccc0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
2ccd0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
2cce0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
2ccf0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
2cd00 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
2cd10 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
2cd20 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
2cd30 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
2cd40 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
2cd50 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2cd60 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
2cd70 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
2cd80 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2cd90 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
2cda0 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2cdb0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
2cdc0 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
2cdd0 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
2cde0 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
2cdf0 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
2ce00 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
2ce10 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
2ce20 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
2ce30 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
2ce40 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
2ce50 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
2ce60 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
2ce70 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
2ce80 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
2ce90 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
2cea0 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
2ceb0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
2cec0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
2ced0 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
2cee0 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
2cef0 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
2cf00 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
2cf10 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2cf20 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2cf30 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2cf40 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49  (*const vxworksI
2cf50 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
2cf60 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
2cf70 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65  = vxworksIoFinde
2cf80 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2cf90 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
2cfa0 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
2cfb0 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
2cfc0 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d  inter to an IO m
2cfd0 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
2cfe0 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
2cff0 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
2d000 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
2d010 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
2d020 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2d030 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
2d040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d080 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2d090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2d0a0 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
2d0b0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
2d0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d0d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
2d0e0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
2d0f0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2d100 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
2d110 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
2d120 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
2d130 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
2d140 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2d150 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
2d160 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
2d170 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
2d180 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
2d190 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
2d1a0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2d1b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
2d1c0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
2d1d0 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
2d1e0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
2d1f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2d200 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
2d210 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
2d220 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
2d230 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
2d240 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2d250 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2d260 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2d270 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
2d280 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2d290 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
2d2a0 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
2d2b0 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
2d2c0 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76  ore UNIXFILE_* v
2d2d0 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  alues */.){.  co
2d2e0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2d2f0 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
2d300 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
2d310 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
2d320 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
2d330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d340 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
2d350 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
2d360 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69  ;..  /* No locki
2d370 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d  ng occurs in tem
2d380 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a  porary files */.
2d390 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2d3a0 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46  ame!=0 || (ctrlF
2d3b0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2d3c0 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20  NOLOCK)!=0 );.. 
2d3d0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
2d3e0 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
2d3f0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
2d400 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
2d410 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66  pNew->pVfs = pVf
2d420 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68  s;.  pNew->zPath
2d430 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
2d440 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2d450 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b  = (u8)ctrlFlags;
2d460 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
2d470 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e  MMAP_SIZE>0.  pN
2d480 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  ew->mmapSizeMax 
2d490 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2d4a0 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
2d4b0 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
2d4c0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
2d4d0 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2d4e0 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
2d4f0 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
2d520 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
2d530 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
2d540 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2d550 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
2d560 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  SOW;.  }.  if( s
2d570 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  trcmp(pVfs->zNam
2d580 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d  e,"unix-excl")==
2d590 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
2d5a0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2d5b0 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a  FILE_EXCL;.  }..
2d5c0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2d5d0 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
2d5e0 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
2d5f0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
2d600 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
2d610 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c  .    ctrlFlags |
2d620 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
2d630 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
2d640 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2d650 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2d660 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49   ctrlFlags & UNI
2d670 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a  XFILE_NOLOCK ){.
2d680 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
2d690 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  e = &nolockIoMet
2d6a0 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2d6b0 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
2d6c0 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79   = (**(finder_ty
2d6d0 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61  pe*)pVfs->pAppDa
2d6e0 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ta)(zFilename, p
2d6f0 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  New);.#if SQLITE
2d700 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2d710 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
2d720 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
2d730 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
2d740 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
2d750 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
2d760 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
2d770 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
2d780 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
2d790 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
2d7a0 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
2d7b0 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
2d7c0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2d7d0 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
2d7e0 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
2d7f0 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2d800 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
2d810 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
2d820 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
2d830 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2d840 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2d850 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2d860 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2d870 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2d880 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c  _STYLE.    || pL
2d890 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2d8a0 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e  nfsIoMethods.#en
2d8b0 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69  dif.  ){.    uni
2d8c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2d8d0 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
2d8e0 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
2d8f0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
2d900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d910 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  K ){.      /* If
2d920 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2d930 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49  ed in findInodeI
2d940 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65  nfo(), close the
2d950 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2d960 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  .      ** immedi
2d970 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65  ately, before re
2d980 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  leasing the mute
2d990 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  x. findInodeInfo
2d9a0 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20  () may fail.    
2d9b0 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e    ** in two scen
2d9c0 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  arios:.      **.
2d9d0 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41        **   (a) A
2d9e0 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29   call to fstat()
2d9f0 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2da00 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63  *   (b) A malloc
2da10 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2da20 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61  *.      ** Scena
2da30 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79  rio (b) may only
2da40 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72   occur if the pr
2da50 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
2da60 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20   no other.      
2da70 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
2da80 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
2da90 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68  same file. If th
2daa0 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66  ere were other f
2dab0 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
2dac0 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73  criptors on this
2dad0 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d   file, then no m
2dae0 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72  alloc would be r
2daf0 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2db00 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   ** findInodeInf
2db10 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20  o(). If this is 
2db20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20  the case, it is 
2db30 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c  quite safe to cl
2db40 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ose.      ** han
2db50 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73  dle h - as it is
2db60 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
2db70 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20   no posix locks 
2db80 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64  will be released
2db90 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69  .      ** by doi
2dba0 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a  ng so..      **.
2dbb0 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e        ** If scen
2dbc0 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20  ario (a) caused 
2dbd0 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74  the error then t
2dbe0 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f  hings are not so
2dbf0 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20   safe. The.     
2dc00 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73   ** implicit ass
2dc10 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20  umption here is 
2dc20 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20  that if fstat() 
2dc30 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72  fails, things ar
2dc40 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75  e in.      ** su
2dc50 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61  ch bad shape tha
2dc60 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63  t dropping a loc
2dc70 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74  k or two doesn't
2dc80 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20   matter much..  
2dc90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62      */.      rob
2dca0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2dcb0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2dcc0 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2dcd0 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2dce0 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66  utex();.  }..#if
2dcf0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2dd00 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2dd10 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2dd20 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  _).  else if( pL
2dd30 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2dd40 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
2dd50 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69      /* AFP locki
2dd60 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2dd70 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2dd80 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
2dd90 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61   in.    ** the a
2dda0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2ddb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70  ..    */.    afp
2ddc0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2ddd0 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pCtx;.    pNew->
2dde0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2ddf0 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
2de00 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
2de10 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
2de20 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
2de30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2de40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2de50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2de60 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78  NB: zFilename ex
2de70 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73  ists and remains
2de80 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
2de90 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a   file is closed.
2dea0 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69        ** accordi
2deb0 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e  ng to requiremen
2dec0 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65  t F11141.  So we
2ded0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
2dee0 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  make a.      ** 
2def0 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
2df00 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  name. */.      p
2df10 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46  Ctx->dbPath = zF
2df20 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ilename;.      p
2df30 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  Ctx->reserved = 
2df40 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  0;.      srandom
2df50 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69  dev();.      uni
2df60 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2df70 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e       rc = findIn
2df80 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
2df90 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
2dfa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2dfb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2dfc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
2dfd0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2dfe0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  xt);.        rob
2dff0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2e000 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2e010 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
2e020 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78      }.      unix
2e030 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20  LeaveMutex();   
2e040 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
2e050 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69  #endif..  else i
2e060 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2e070 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
2e080 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2e090 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
2e0a0 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
2e0b0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
2e0c0 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
2e0d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c  .    ** the dotl
2e0e0 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
2e0f0 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  t .    */.    ch
2e100 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  ar *zLockFile;. 
2e110 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
2e120 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46  ;.    assert( zF
2e130 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ilename!=0 );.  
2e140 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69    nFilename = (i
2e150 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  nt)strlen(zFilen
2e160 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c  ame) + 6;.    zL
2e170 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
2e180 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
2e190 36 34 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  64(nFilename);. 
2e1a0 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65     if( zLockFile
2e1b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2e1c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2e1d0 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
2e1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2e1f0 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
2e200 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
2e210 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
2e220 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
2e230 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
2e240 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
2e250 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
2e260 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2e270 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2e280 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
2e290 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2e2a0 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
2e2b0 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
2e2c0 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
2e2d0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
2e2e0 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
2e2f0 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
2e300 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
2e310 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2e320 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
2e330 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2e340 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2e350 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
2e360 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
2e370 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2e380 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
2e390 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
2e3a0 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
2e3b0 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
2e3c0 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
2e3d0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
2e3e0 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
2e3f0 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
2e400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e410 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
2e420 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
2e430 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
2e440 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
2e450 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
2e460 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
2e470 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
2e480 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
2e490 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2e4a0 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
2e4b0 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
2e4c0 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
2e4d0 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
2e4e0 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
2e4f0 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
2e500 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2e510 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2e520 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
2e530 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27  emName[0] = '\0'
2e540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e550 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2e560 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
2e570 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61 73 74 45  .  .  storeLastE
2e580 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23  rrno(pNew, 0);.#
2e590 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2e5a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e5b0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d  K ){.    if( h>=
2e5c0 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  0 ) robust_close
2e5d0 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2e5e0 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b  __);.    h = -1;
2e5f0 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46  .    osUnlink(zF
2e600 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ilename);.    pN
2e610 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
2e620 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
2e630 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
2e640 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e650 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2e660 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2e670 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2e680 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  _);.  }else{.   
2e690 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
2e6a0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a   pLockingStyle;.
2e6b0 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
2e6c0 2b 31 29 3b 0a 20 20 20 20 76 65 72 69 66 79 44  +1);.    verifyD
2e6d0 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d  bFile(pNew);.  }
2e6e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e6f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2e700 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  e name of a dire
2e710 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74  ctory in which t
2e720 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20  o put temporary 
2e730 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20  files..** If no 
2e740 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61  suitable tempora
2e750 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72  ry file director
2e760 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  y can be found, 
2e770 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
2e780 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2e790 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44  r *unixTempFileD
2e7a0 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ir(void){.  stat
2e7b0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
2e7c0 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
2e7d0 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20   0,.     0,.    
2e7e0 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
2e7f0 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
2e800 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
2e810 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67  ".".  };.  unsig
2e820 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  ned int i = 0;. 
2e830 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
2e840 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2e850 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 74  zDir = sqlite3_t
2e860 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a  emp_directory;..
2e870 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d    if( !azDirs[0]
2e880 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67   ) azDirs[0] = g
2e890 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
2e8a0 50 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61  PDIR");.  if( !a
2e8b0 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72  zDirs[1] ) azDir
2e8c0 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[1] = getenv("T
2e8d0 4d 50 44 49 52 22 29 3b 0a 20 20 77 68 69 6c 65  MPDIR");.  while
2e8e0 28 31 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69  (1){.    if( zDi
2e8f0 72 21 3d 30 0a 20 20 20 20 20 26 26 20 6f 73 53  r!=0.     && osS
2e900 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 3d  tat(zDir, &buf)=
2e910 3d 30 0a 20 20 20 20 20 26 26 20 53 5f 49 53 44  =0.     && S_ISD
2e920 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a  IR(buf.st_mode).
2e930 20 20 20 20 20 26 26 20 6f 73 41 63 63 65 73 73       && osAccess
2e940 28 7a 44 69 72 2c 20 30 33 29 3d 3d 30 0a 20 20  (zDir, 03)==0.  
2e950 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2e960 6e 20 7a 44 69 72 3b 0a 20 20 20 20 7d 0a 20 20  n zDir;.    }.  
2e970 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
2e980 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61  azDirs)/sizeof(a
2e990 7a 44 69 72 73 5b 30 5d 29 20 29 20 62 72 65 61  zDirs[0]) ) brea
2e9a0 6b 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  k;.    zDir = az
2e9b0 44 69 72 73 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20  Dirs[i++];.  }. 
2e9c0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2e9d0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
2e9e0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
2e9f0 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
2ea00 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2ea10 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
2ea20 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
2ea30 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
2ea40 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
2ea50 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
2ea60 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
2ea70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2ea80 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
2ea90 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2eaa0 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  f){.  const char
2eab0 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20 69 4c   *zDir;.  int iL
2eac0 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  imit = 0;..  /* 
2ead0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
2eae0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
2eaf0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
2eb00 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
2eb10 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
2eb20 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
2eb30 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
2eb40 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
2eb50 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
2eb60 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
2eb70 20 2a 2f 0a 20 20 7a 42 75 66 5b 30 5d 20 3d 20   */.  zBuf[0] = 
2eb80 30 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  0;.  SimulateIOE
2eb90 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2eba0 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
2ebb0 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
2ebc0 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
2ebd0 7a 44 69 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  zDir==0 ) return
2ebe0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45   SQLITE_IOERR_GE
2ebf0 54 54 45 4d 50 50 41 54 48 3b 0a 20 20 64 6f 7b  TTEMPPATH;.  do{
2ec00 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
2ec10 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2ec20 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72  ss(sizeof(r), &r
2ec30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2ec40 42 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a 42 75  Buf>2 );.    zBu
2ec50 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b 0a 20  f[nBuf-2] = 0;. 
2ec60 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2ec70 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
2ec80 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
2ec90 5f 46 49 4c 45 5f 50 52 45 46 49 58 22 25 6c 6c  _FILE_PREFIX"%ll
2eca0 78 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x%c",.          
2ecb0 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c             zDir,
2ecc0 20 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   r, 0);.    if( 
2ecd0 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d 30 20  zBuf[nBuf-2]!=0 
2ece0 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e 31 30  || (iLimit++)>10
2ecf0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2ed00 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69 6c 65  _ERROR;.  }while
2ed10 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c  ( osAccess(zBuf,
2ed20 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
2ed30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ed40 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2ed50 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2ed60 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2ed70 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  LE__)./*.** Rout
2ed80 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  ine to transform
2ed90 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f   a unixFile into
2eda0 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67   a proxy-locking
2edb0 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d   unixFile..** Im
2edc0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20  plementation in 
2edd0 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64  the proxy-lock d
2ede0 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65  ivision, but use
2edf0 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a  d by unixOpen().
2ee00 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45  ** if SQLITE_PRE
2ee10 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2ee20 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
2ee30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2ee40 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2ee50 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f  le(unixFile*, co
2ee60 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64  nst char*);.#end
2ee70 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  if../*.** Search
2ee80 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
2ee90 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
2eea0 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  hat was opened o
2eeb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
2eec0 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  ** file (not a j
2eed0 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72  ournal or master
2eee0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69  -journal file) i
2eef0 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74  dentified by pat
2ef00 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77  hname.** zPath w
2ef10 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ith SQLITE_OPEN_
2ef20 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69  XXX flags matchi
2ef30 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20  ng those passed 
2ef40 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  as the second.**
2ef50 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2ef60 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2ef70 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65  * Such a file de
2ef80 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69  scriptor may exi
2ef90 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65  st if a database
2efa0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
2efb0 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68  closed.** but th
2efc0 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
2efd0 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75  e descriptor cou
2efe0 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  ld not be closed
2eff0 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a   because some.**
2f000 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
2f010 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  riptor open on t
2f020 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20  he same file is 
2f030 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c  holding a file-l
2f040 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f  ock..** Refer to
2f050 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65   comments in the
2f060 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e   unixClose() fun
2f070 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65  ction and the le
2f080 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  ngthy comment.**
2f090 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73   describing "Pos
2f0a0 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
2f0b0 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72  ing" at the star
2f0c0 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66  t of this file f
2f0d0 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64  or .** further d
2f0e0 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69  etails. Also, ti
2f0f0 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a  cket #4018..**.*
2f100 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20  * If a suitable 
2f110 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2f120 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69  is found, then i
2f130 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  t is returned. I
2f140 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c  f no.** such fil
2f150 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2f160 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72  located, -1 is r
2f170 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2f180 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ic UnixUnusedFd 
2f190 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28  *findReusableFd(
2f1a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2f1b0 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  h, int flags){. 
2f1c0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2f1d0 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  Unused = 0;..  /
2f1e0 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20  * Do not search 
2f1f0 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
2f200 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
2f210 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65   vxworks. Not be
2f220 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72  cause.  ** vxwor
2f230 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e  ks would not ben
2f240 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68  efit from the ch
2f250 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20  ange (it might, 
2f260 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c  we're not sure),
2f270 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73  .  ** but becaus
2f280 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74  e no way to test
2f290 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2f2a0 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69   available. It i
2f2b0 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e  s better .  ** n
2f2c0 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b  ot to risk break
2f2d0 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70  ing vxworks supp
2f2e0 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65  ort for the sake
2f2f0 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63   of such an obsc
2f300 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72  ure .  ** featur
2f310 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56  e.  */.#if !OS_V
2f320 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
2f330 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f350 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74   Results of stat
2f360 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 75 6e  () call */..  un
2f370 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2f380 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63  .  /* A stat() c
2f390 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72  all may fail for
2f3a0 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73   various reasons
2f3b0 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
2f3c0 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c  s, it is.  ** al
2f3d0 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61  most certain tha
2f3e0 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c  t an open() call
2f3f0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
2f400 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c  h will also fail
2f410 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20  ..  ** For this 
2f420 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72  reason, if an er
2f430 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
2f440 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65  e stat() call he
2f450 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  re, it is.  ** i
2f460 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73  gnored and -1 is
2f470 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63   returned. The c
2f480 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74  aller will try t
2f490 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
2f4a0 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f  e.  ** descripto
2f4b0 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  r on the same pa
2f4c0 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65  th, fail, and re
2f4d0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f  turn an error to
2f4e0 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20   SQLite..  **.  
2f4f0 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62  ** Even if a sub
2f500 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63  sequent open() c
2f510 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64  all does succeed
2f520 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63  , the consequenc
2f530 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73  es of.  ** not s
2f540 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72  earching for a r
2f550 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73  eusable file des
2f560 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20  criptor are not 
2f570 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  dire.  */.  if( 
2f580 6e 55 6e 75 73 65 64 46 64 3e 30 20 26 26 20 30  nUnusedFd>0 && 0
2f590 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20  ==osStat(zPath, 
2f5a0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75  &sStat) ){.    u
2f5b0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
2f5c0 6e 6f 64 65 3b 0a 0a 20 20 20 20 70 49 6e 6f 64  node;..    pInod
2f5d0 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
2f5e0 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65     while( pInode
2f5f0 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c   && (pInode->fil
2f600 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73  eId.dev!=sStat.s
2f610 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20  t_dev.          
2f620 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49             || pI
2f630 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
2f640 21 3d 28 75 36 34 29 73 53 74 61 74 2e 73 74 5f  !=(u64)sStat.st_
2f650 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70  ino) ){.       p
2f660 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  Inode = pInode->
2f670 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
2f680 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20   if( pInode ){. 
2f690 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46       UnixUnusedF
2f6a0 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f  d **pp;.      fo
2f6b0 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55  r(pp=&pInode->pU
2f6c0 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a  nused; *pp && (*
2f6d0 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67  pp)->flags!=flag
2f6e0 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  s; pp=&((*pp)->p
2f6f0 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55  Next));.      pU
2f700 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20  nused = *pp;.   
2f710 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
2f720 7b 0a 20 20 20 20 20 20 20 20 6e 55 6e 75 73 65  {.        nUnuse
2f730 64 46 64 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2a  dFd--;.        *
2f740 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e  pp = pUnused->pN
2f750 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
2f760 20 7d 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61   }.  }.  unixLea
2f770 76 65 4d 75 74 65 78 28 29 3b 0a 23 65 6e 64 69  veMutex();.#endi
2f780 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56  f    /* if !OS_V
2f790 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75  XWORKS */.  retu
2f7a0 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f  rn pUnused;.}../
2f7b0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6d 6f  *.** Find the mo
2f7c0 64 65 2c 20 75 69 64 20 61 6e 64 20 67 69 64 20  de, uid and gid 
2f7d0 6f 66 20 66 69 6c 65 20 7a 46 69 6c 65 2e 20 0a  of file zFile. .
2f7e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
2f7f0 74 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  tFileMode(.  con
2f800 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  st char *zFile, 
2f810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f820 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 6d  File name */.  m
2f830 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20  ode_t *pMode,   
2f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f850 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f  * OUT: Permissio
2f860 6e 73 20 6f 66 20 7a 46 69 6c 65 20 2a 2f 0a 20  ns of zFile */. 
2f870 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20   uid_t *pUid,   
2f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f890 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 6f 66 20   /* OUT: uid of 
2f8a0 7a 46 69 6c 65 2e 20 2a 2f 0a 20 20 67 69 64 5f  zFile. */.  gid_
2f8b0 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20  t *pGid         
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2f8d0 55 54 3a 20 67 69 64 20 6f 66 20 7a 46 69 6c 65  UT: gid of zFile
2f8e0 2e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  . */.){.  struct
2f8f0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
2f900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2f910 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e  put of stat() on
2f920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2f930 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2f940 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 30 3d  ITE_OK;.  if( 0=
2f950 3d 6f 73 53 74 61 74 28 7a 46 69 6c 65 2c 20 26  =osStat(zFile, &
2f960 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 2a 70  sStat) ){.    *p
2f970 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f  Mode = sStat.st_
2f980 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20  mode & 0777;.   
2f990 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73   *pUid = sStat.s
2f9a0 74 5f 75 69 64 3b 0a 20 20 20 20 2a 70 47 69 64  t_uid;.    *pGid
2f9b0 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b   = sStat.st_gid;
2f9c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2f9d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
2f9e0 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 72 65 74  FSTAT;.  }.  ret
2f9f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2fa00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2fa10 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78  s called by unix
2fa20 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d  Open() to determ
2fa30 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65 72  ine the unix per
2fa40 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63  missions.** to c
2fa50 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20  reate new files 
2fa60 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f  with. If no erro
2fa70 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2fa80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2fa90 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61  rned.** and a va
2faa0 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  lue suitable for
2fab0 20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65 20   passing as the 
2fac0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74  third argument t
2fad0 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20  o open(2) is.** 
2fae0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64  written to *pMod
2faf0 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  e. If an IO erro
2fb00 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
2fb10 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
2fb20 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  s .** returned a
2fb30 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
2fb40 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f  *pMode is not mo
2fb50 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  dified..**.** In
2fb60 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 74 68 69   most cases, thi
2fb70 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a  s routine sets *
2fb80 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63  pMode to 0, whic
2fb90 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a  h will become.**
2fba0 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74   an indication t
2fbb0 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20  o robust_open() 
2fbc0 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 66 69  to create the fi
2fbd0 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49  le using.** SQLI
2fbe0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2fbf0 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75  PERMISSIONS adju
2fc00 73 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  sted by the umas
2fc10 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  k..** But if the
2fc20 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
2fc30 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72  ed is a WAL or r
2fc40 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2fc50 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ile, then .** th
2fc60 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72  is function quer
2fc70 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ies the file-sys
2fc80 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d  tem for the perm
2fc90 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a  issions on the .
2fca0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
2fcb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2fcc0 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  nd sets *pMode t
2fcd0 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68  o this value. Wh
2fce0 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69  enever .** possi
2fcf0 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75  ble, WAL and jou
2fd00 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63  rnal files are c
2fd10 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
2fd20 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
2fd30 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73  s .** as the ass
2fd40 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
2fd50 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
2fd60 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
2fd70 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69  E_8_3_NAMES opti
2fd80 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
2fd90 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  hen the.** origi
2fda0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
2fdb0 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  unavailable.  Bu
2fdc0 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f  t 8_3_NAMES is o
2fdd0 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  nly used for.** 
2fde0 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20  FAT filesystems 
2fdf0 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  and permissions 
2fe00 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68  do not matter th
2fe10 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65  ere, so just use
2fe20 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
2fe30 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a  permissions..*/.
2fe40 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43  static int findC
2fe50 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20  reateFileMode(. 
2fe60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2fe70 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
2fe80 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65   /* Path of file
2fe90 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e   (possibly) bein
2fea0 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69  g created */.  i
2feb0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fed0 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61  * Flags passed a
2fee0 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74  s 4th argument t
2fef0 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d  o xOpen() */.  m
2ff00 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20  ode_t *pMode,   
2ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ff20 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f  * OUT: Permissio
2ff30 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20  ns to open file 
2ff40 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20  with */.  uid_t 
2ff50 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20  *pUid,          
2ff60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2ff70 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : uid to set on 
2ff80 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69  the file */.  gi
2ff90 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20  d_t *pGid       
2ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ffb0 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74   OUT: gid to set
2ffc0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
2ffd0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2ffe0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2fff0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
30000 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20  ode */.  *pMode 
30010 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30  = 0;.  *pUid = 0
30020 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20  ;.  *pGid = 0;. 
30030 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
30040 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
30050 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
30060 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63  OURNAL) ){.    c
30070 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48  har zDb[MAX_PATH
30080 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  NAME+1];     /* 
30090 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  Database file pa
300a0 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44  th */.    int nD
300b0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
300c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
300d0 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73  r of valid bytes
300e0 20 69 6e 20 7a 44 62 20 2a 2f 0a 0a 20 20 20 20   in zDb */..    
300f0 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61  /* zPath is a pa
30100 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a  th to a WAL or j
30110 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
30120 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
30130 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20   derives.    ** 
30140 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
30150 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
30160 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50  ase file from zP
30170 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ath. This block 
30180 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74  handles.    ** t
30190 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d  he following nam
301a0 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a  ing conventions:
301b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
301c0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a   "<path to db>-j
301d0 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20  ournal".    **  
301e0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
301f0 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
30200 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
30210 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22  alNN".    **   "
30220 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
30230 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  NN".    **.    *
30240 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20  * where NN is a 
30250 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20  decimal number. 
30260 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63  The NN naming sc
30270 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a  hemes are .    *
30280 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  * used by the te
30290 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d  st_multiplex.c m
302a0 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  odule..    */.  
302b0 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53    nDb = sqlite3S
302c0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d  trlen30(zPath) -
302d0 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20   1; .    while( 
302e0 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
302f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 6e  ){.      /* In n
30300 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 2c  ormal operation,
30310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30320 65 20 6e 61 6d 65 20 77 69 6c 6c 20 61 6c 77 61  e name will alwa
30330 79 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  ys contain.     
30340 20 2a 2a 20 61 20 27 2d 27 20 63 68 61 72 61 63   ** a '-' charac
30350 74 65 72 2e 20 20 48 6f 77 65 76 65 72 20 69 6e  ter.  However in
30360 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 20 6d 6f   8+3 filename mo
30370 64 65 2c 20 6f 72 20 69 66 20 61 20 63 6f 72 72  de, or if a corr
30380 75 70 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  upt.      ** rol
30390 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 70  lback journal sp
303a0 65 63 69 66 69 65 73 20 61 20 6d 61 73 74 65 72  ecifies a master
303b0 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 20 61 20   journal with a 
303c0 67 6f 6f 66 79 20 6e 61 6d 65 2c 20 74 68 65 6e  goofy name, then
303d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 27 2d  .      ** the '-
303e0 27 20 6d 69 67 68 74 20 62 65 20 6d 69 73 73 69  ' might be missi
303f0 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ng. */.      if(
30400 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68   nDb==0 || zPath
30410 5b 6e 44 62 5d 3d 3d 27 2e 27 20 29 20 72 65 74  [nDb]=='.' ) ret
30420 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
30430 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20       nDb--;.    
30440 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  }.    memcpy(zDb
30450 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20  , zPath, nDb);. 
30460 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c     zDb[nDb] = '\
30470 30 27 3b 0a 0a 20 20 20 20 72 63 20 3d 20 67 65  0';..    rc = ge
30480 74 46 69 6c 65 4d 6f 64 65 28 7a 44 62 2c 20 70  tFileMode(zDb, p
30490 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64  Mode, pUid, pGid
304a0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  );.  }else if( f
304b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
304c0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
304d0 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d   ){.    *pMode =
304e0 20 30 36 30 30 3b 0a 20 20 7d 65 6c 73 65 20 69   0600;.  }else i
304f0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
30500 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20  E_OPEN_URI ){.  
30510 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
30520 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  a main database 
30530 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
30540 65 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69  e was opened usi
30550 6e 67 20 61 20 55 52 49 0a 20 20 20 20 2a 2a 20  ng a URI.    ** 
30560 66 69 6c 65 6e 61 6d 65 2c 20 63 68 65 63 6b 20  filename, check 
30570 66 6f 72 20 74 68 65 20 22 6d 6f 64 65 6f 66 22  for the "modeof"
30580 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20 70   parameter. If p
30590 72 65 73 65 6e 74 2c 20 69 6e 74 65 72 70 72 65  resent, interpre
305a0 74 0a 20 20 20 20 2a 2a 20 69 74 73 20 76 61 6c  t.    ** its val
305b0 75 65 20 61 73 20 61 20 66 69 6c 65 6e 61 6d 65  ue as a filename
305c0 20 61 6e 64 20 74 72 79 20 74 6f 20 63 6f 70 79   and try to copy
305d0 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64 20 61   the mode, uid a
305e0 6e 64 20 67 69 64 20 66 72 6f 6d 0a 20 20 20 20  nd gid from.    
305f0 2a 2a 20 74 68 61 74 20 66 69 6c 65 2e 20 20 2a  ** that file.  *
30600 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
30610 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
30620 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 50 61 74  i_parameter(zPat
30630 68 2c 20 22 6d 6f 64 65 6f 66 22 29 3b 0a 20 20  h, "modeof");.  
30640 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
30650 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64   rc = getFileMod
30660 65 28 7a 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64  e(z, pMode, pUid
30670 2c 20 70 47 69 64 29 3b 0a 20 20 20 20 7d 0a 20  , pGid);.    }. 
30680 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
30690 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
306a0 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a  e file zPath..**
306b0 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c   .** Previously,
306c0 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c   the SQLite OS l
306d0 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20  ayer used three 
306e0 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61  functions in pla
306f0 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e  ce of this.** on
30700 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  e:.**.**     sql
30710 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
30720 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  ite();.**     sq
30730 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
30740 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71  nly();.**     sq
30750 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
30760 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  sive();.**.** Th
30770 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73  ese calls corres
30780 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c  pond to the foll
30790 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
307a0 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ns of flags:.**.
307b0 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65  **     ReadWrite
307c0 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57  () ->     (READW
307d0 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a  RITE | CREATE).*
307e0 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29  *     ReadOnly()
307f0 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e    ->     (READON
30800 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e  LY) .**     Open
30810 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28  Exclusive() -> (
30820 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
30830 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a  TE | EXCLUSIVE).
30840 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70  **.** The old Op
30850 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63  enExclusive() ac
30860 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e  cepted a boolean
30870 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c   argument - "del
30880 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75  Flag". If.** tru
30890 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  e, the file was 
308a0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65  configured to be
308b0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
308c0 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a  eleted when the.
308d0 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63  ** file handle c
308e0 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76  losed. To achiev
308f0 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63  e the same effec
30900 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77  t using this new
30910 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20   .** interface, 
30920 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e  add the DELETEON
30930 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68  CLOSE flag to th
30940 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62  ose specified ab
30950 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e  ove for .** Open
30960 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a  Exclusive()..*/.
30970 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
30980 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
30990 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
309a0 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66      /* The VFS f
309b0 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
309c0 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f   the xOpen metho
309d0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
309e0 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
309f0 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20      /* Pathname 
30a00 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70  of file to be op
30a10 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
30a20 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
30a30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
30a40 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
30a50 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f   be filled in */
30a60 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
30a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a80 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74  /* Input flags t
30a90 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70  o control the op
30aa0 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a  ening */.  int *
30ab0 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
30ac0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
30ad0 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  t flags returned
30ae0 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20   to SQLite core 
30af0 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
30b00 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20   *p = (unixFile 
30b10 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66  *)pFile;.  int f
30b20 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
30b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
30b40 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74  e descriptor ret
30b50 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20  urned by open() 
30b60 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  */.  int openFla
30b70 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
30b80 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
30b90 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a  pass to open() *
30ba0 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
30bb0 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
30bc0 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
30bd0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
30be0 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20  int noLock;     
30bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30c00 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c  * True to omit l
30c10 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
30c20 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
30c30 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
30c40 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
30c50 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
30c60 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  .  int ctrlFlags
30c70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30c80 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20    /* UNIXFILE_* 
30c90 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  flags */..  int 
30ca0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
30cb0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
30cc0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
30cd0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
30ce0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
30cf0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
30d00 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
30d10 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
30d20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
30d30 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
30d40 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
30d50 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
30d60 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
30d70 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
30d80 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
30d90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
30da0 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49  WRITE);.#if SQLI
30db0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
30dc0 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73  G_STYLE.  int is
30dd0 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c  AutoProxy  = (fl
30de0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
30df0 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65  N_AUTOPROXY);.#e
30e00 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
30e10 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53  (__APPLE__) || S
30e20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
30e30 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72  KING_STYLE.  str
30e40 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
30e50 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  o;.#endif..  /* 
30e60 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61  If creating a ma
30e70 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c  ster or main-fil
30e80 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20  e journal, this 
30e90 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70  function will op
30ea0 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64  en.  ** a file-d
30eb0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
30ec0 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20   directory too. 
30ed0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75  The first time u
30ee0 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69  nixSync().  ** i
30ef0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72  s called the dir
30f00 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
30f10 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66  riptor will be f
30f20 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f  sync()ed and clo
30f30 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e  se()d..  */.  in
30f40 74 20 69 73 4e 65 77 4a 72 6e 6c 20 3d 20 28 69  t isNewJrnl = (i
30f50 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
30f60 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
30f70 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
30f80 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
30f90 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
30fa0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
30fb0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
30fc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
30fd0 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61    ));..  /* If a
30fe0 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
30ff0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
31000 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
31010 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
31020 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
31030 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
31040 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
31050 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
31060 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
31070 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
31080 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e  THNAME+2];.  con
31090 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
310a0 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
310b0 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
310c0 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
310d0 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
310e0 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
310f0 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
31100 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
31110 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
31120 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
31130 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
31140 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
31150 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
31160 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
31170 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
31180 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
31190 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
311a0 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
311b0 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
311c0 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
311d0 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
311e0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
311f0 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
31200 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
31210 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
31220 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
31230 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
31240 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
31250 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
31260 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
31270 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
31280 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
31290 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
312a0 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
312b0 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
312c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
312d0 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
312e0 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
312f0 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
31300 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
31310 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
31320 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
31330 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
31340 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
31350 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
31360 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
31370 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
31380 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
31390 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
313a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
313b0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
313c0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
313d0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
313e0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
313f0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
31400 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
31410 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
31420 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
31430 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
31440 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
31450 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
31460 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
31470 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
31480 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
31490 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
314a0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
314b0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
314c0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
314d0 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
314e0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
314f0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
31500 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
31510 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
31520 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
31530 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
31540 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
31550 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
31560 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
31570 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
31580 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
31590 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
315a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
315b0 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  _WAL.  );..  /* 
315c0 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68 61  Detect a pid cha
315d0 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  nge and reset th
315e0 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69  e PRNG.  There i
315f0 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
31600 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63  on.  ** here suc
31610 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f  h that two or mo
31620 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74  re threads all t
31630 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61  rying to open da
31640 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20  tabases at.  ** 
31650 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74  the same instant
31660 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74   might all reset
31670 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20   the PRNG.  But 
31680 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a  multiple resets.
31690 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73    ** are harmles
316a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61  s..  */.  if( ra
316b0 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47  ndomnessPid!=osG
316c0 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20 20 20  etpid(0) ){.    
316d0 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20  randomnessPid = 
316e0 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20 20 20  osGetpid(0);.   
316f0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
31700 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 20 20  ess(0,0);.  }.  
31710 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
31720 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
31730 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
31740 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
31750 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
31760 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
31770 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
31780 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
31790 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
317a0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
317b0 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
317c0 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
317d0 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
317e0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
317f0 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  64(sizeof(*pUnus
31800 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
31810 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
31820 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31830 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
31840 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
31850 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
31860 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
31870 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ;..    /* Databa
31880 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
31890 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
318a0 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
318b0 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55  are not.    ** U
318c0 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
318d0 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
318e0 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
318f0 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20  passed into.    
31900 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
31910 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
31920 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67     assert( (flag
31930 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
31940 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74  URI) || zName[st
31950 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
31960 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66  0 );..  }else if
31970 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( !zName ){.    
31980 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e  /* If zName is N
31990 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ULL, the upper l
319a0 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69  ayer is requesti
319b0 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  ng a temp file. 
319c0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  */.    assert(is
319d0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4e 65 77  Delete && !isNew
319e0 4a 72 6e 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Jrnl);.    rc = 
319f0 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
31a00 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
31a10 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
31a20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31a30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
31a40 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
31a50 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d   zName = zTmpnam
31a60 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  e;..    /* Gener
31a70 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  ated temporary f
31a80 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77  ilenames are alw
31a90 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  ays double-zero 
31aa0 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a  terminated.    *
31ab0 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c  * for use by sql
31ac0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
31ad0 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73  er(). */.    ass
31ae0 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65  ert( zName[strle
31af0 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29  n(zName)+1]==0 )
31b00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
31b10 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
31b20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  of the flags par
31b30 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
31b40 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a   POSIX function.
31b50 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65    ** open(). The
31b60 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75  se must be calcu
31b70 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70  lated even if op
31b80 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  en() is not call
31b90 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79  ed, as.  ** they
31ba0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
31bb0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  s part of the fi
31bc0 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73  le handle and us
31bd0 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20  ed by the .  ** 
31be0 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63  'conch file' loc
31bf0 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c  king functions l
31c00 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69  ater on.  */.  i
31c10 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20  f( isReadonly ) 
31c20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
31c30 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73  RDONLY;.  if( is
31c40 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e  ReadWrite ) open
31c50 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b  Flags |= O_RDWR;
31c60 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20  .  if( isCreate 
31c70 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  )    openFlags |
31c80 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28  = O_CREAT;.  if(
31c90 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f   isExclusive ) o
31ca0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45  penFlags |= (O_E
31cb0 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b  XCL|O_NOFOLLOW);
31cc0 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  .  openFlags |= 
31cd0 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  (O_LARGEFILE|O_B
31ce0 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66  INARY);..  if( f
31cf0 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f  d<0 ){.    mode_
31d00 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  t openMode;     
31d10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d           /* Perm
31d20 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74  issions to creat
31d30 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20  e file with */. 
31d40 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20     uid_t uid;   
31d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d60 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74   /* Userid for t
31d70 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67  he file */.    g
31d80 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20  id_t gid;       
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31da0 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20  Groupid for the 
31db0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  file */.    rc =
31dc0 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
31dd0 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  ode(zName, flags
31de0 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69  , &openMode, &ui
31df0 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66  d, &gid);.    if
31e00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31e10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
31e20 20 21 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74   !p->pPreallocat
31e30 65 64 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20  edUnused );.    
31e40 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
31e50 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
31e60 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
31e70 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
31e80 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74  NAL );.      ret
31e90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
31ea0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
31eb0 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
31ec0 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
31ed0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
31ee0 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25  ENX   %-3d %s 0%
31ef0 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c  o\n", fd, zName,
31f00 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20   openFlags));.  
31f10 20 20 61 73 73 65 72 74 28 20 21 69 73 45 78 63    assert( !isExc
31f20 6c 75 73 69 76 65 20 7c 7c 20 28 6f 70 65 6e 46  lusive || (openF
31f30 6c 61 67 73 20 26 20 4f 5f 43 52 45 41 54 29 21  lags & O_CREAT)!
31f40 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 66 64  =0 );.    if( fd
31f50 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
31f60 69 73 4e 65 77 4a 72 6e 6c 20 26 26 20 65 72 72  isNewJrnl && err
31f70 6e 6f 3d 3d 45 41 43 43 45 53 20 26 26 20 6f 73  no==EACCES && os
31f80 41 63 63 65 73 73 28 7a 4e 61 6d 65 2c 20 46 5f  Access(zName, F_
31f90 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OK) ){.        /
31fa0 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 63  * If unable to c
31fb0 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
31fc0 62 65 63 61 75 73 65 20 74 68 65 20 64 69 72 65  because the dire
31fd0 63 74 6f 72 79 20 69 73 20 6e 6f 74 0a 20 20 20  ctory is not.   
31fe0 20 20 20 20 20 2a 2a 20 77 72 69 74 61 62 6c 65       ** writable
31ff0 2c 20 63 68 61 6e 67 65 20 74 68 65 20 65 72 72  , change the err
32000 6f 72 20 63 6f 64 65 20 74 6f 20 69 6e 64 69 63  or code to indic
32010 61 74 65 20 74 68 61 74 2e 20 2a 2f 0a 20 20 20  ate that. */.   
32020 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32030 5f 52 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54  _READONLY_DIRECT
32040 4f 52 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ORY;.      }else
32050 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 49 53 44   if( errno!=EISD
32060 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
32070 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
32080 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74  Failed to open t
32090 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  he file for read
320a0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
320b0 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f  ry read-only. */
320c0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
320d0 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
320e0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
320f0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
32100 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73         openFlags
32110 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43   &= ~(O_RDWR|O_C
32120 52 45 41 54 29 3b 0a 20 20 20 20 20 20 20 20 66  REAT);.        f
32130 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
32140 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
32150 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
32160 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20  |= O_RDONLY;.   
32170 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
32180 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 64 20  = 1;.        fd 
32190 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
321a0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
321b0 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 20  openMode);.     
321c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
321d0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 69   fd<0 ){.      i
321e0 6e 74 20 72 63 32 20 3d 20 75 6e 69 78 4c 6f 67  nt rc2 = unixLog
321f0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
32200 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
32210 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
32220 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32230 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
32240 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
32250 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
32260 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
32270 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69  process is runni
32280 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69  ng as root and i
32290 66 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77  f creating a new
322a0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a   rollback.    **
322b0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20   journal or WAL 
322c0 66 69 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77  file, set the ow
322d0 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a  nership of the j
322e0 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f  ournal or WAL to
322f0 20 62 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73   be.    ** the s
32300 61 6d 65 20 61 73 20 74 68 65 20 6f 72 69 67 69  ame as the origi
32310 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20  nal database..  
32320 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61    */.    if( fla
32330 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
32340 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
32350 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
32360 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46  ){.      robustF
32370 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20 67  chown(fd, uid, g
32380 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  id);.    }.  }. 
32390 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20 29   assert( fd>=0 )
323a0 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ;.  if( pOutFlag
323b0 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c  s ){.    *pOutFl
323c0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
323d0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 61  ..  if( p->pPrea
323e0 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 29  llocatedUnused )
323f0 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c  {.    p->pPreall
32400 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e 66 64  ocatedUnused->fd
32410 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 50   = fd;.    p->pP
32420 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
32430 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  d->flags = flags
32440 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44  ;.  }..  if( isD
32450 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f  elete ){.#if OS_
32460 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74  VXWORKS.    zPat
32470 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66  h = zName;.#elif
32480 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
32490 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f  UNLINK_AFTER_CLO
324a0 53 45 29 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  SE).    zPath = 
324b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
324c0 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  "%s", zName);.  
324d0 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
324e0 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  {.      robust_c
324f0 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
32500 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65 74  NE__);.      ret
32510 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
32520 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c  _BKPT;.    }.#el
32530 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  se.    osUnlink(
32540 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zName);.#endif. 
32550 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   }.#if SQLITE_EN
32560 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
32570 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70  LE.  else{.    p
32580 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
32590 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e  enFlags;.  }.#en
325a0 64 69 66 0a 20 20 0a 23 69 66 20 64 65 66 69 6e  dif.  .#if defin
325b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
325c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
325d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
325e0 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20 26  f( fstatfs(fd, &
325f0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
32600 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
32610 72 6e 6f 28 70 2c 20 65 72 72 6e 6f 29 3b 0a 20  rno(p, errno);. 
32620 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
32630 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p, fd, __LINE__)
32640 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
32650 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
32660 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d  ;.  }.  if (0 ==
32670 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22   strncmp("msdos"
32680 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  , fsInfo.f_fstyp
32690 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20  ename, 5)) {.   
326a0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
326b0 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20  le)->fsFlags |= 
326c0 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
326d0 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20 69  S_MSDOS;.  }.  i
326e0 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
326f0 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e  "exfat", fsInfo.
32700 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
32710 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
32720 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
32730 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
32740 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
32750 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
32760 20 53 65 74 20 75 70 20 61 70 70 72 6f 70 72 69   Set up appropri
32770 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f  ate ctrlFlags */
32780 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
32790 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
327a0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
327b0 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
327c0 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
327d0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  )              c
327e0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
327f0 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 6e  FILE_RDONLY;.  n
32800 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
32810 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
32820 44 42 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b  DB;.  if( noLock
32830 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
32840 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
32850 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
32860 3b 0a 20 20 69 66 28 20 69 73 4e 65 77 4a 72 6e  ;.  if( isNewJrn
32870 6c 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  l )             
32880 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
32890 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b  NIXFILE_DIRSYNC;
328a0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
328b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29  QLITE_OPEN_URI )
328c0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
328d0 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66  IXFILE_URI;..#if
328e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
328f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66  OCKING_STYLE.#if
32900 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
32910 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69  ROXY_LOCKING.  i
32920 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a  sAutoProxy = 1;.
32930 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41  #endif.  if( isA
32940 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61  utoProxy && (zPa
32950 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e  th!=NULL) && (!n
32960 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e  oLock) && pVfs->
32970 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  xOpen ){.    cha
32980 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65  r *envforce = ge
32990 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52  tenv("SQLITE_FOR
329a0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
329b0 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50  ");.    int useP
329c0 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  roxy = 0;..    /
329d0 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  * SQLITE_FORCE_P
329e0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20  ROXY_LOCKING==1 
329f0 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61  means force alwa
32a00 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20  ys use proxy, 0 
32a10 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65  means .    ** ne
32a20 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e  ver use proxy, N
32a30 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72  ULL means use pr
32a40 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61  oxy for non-loca
32a50 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a  l files only.  *
32a60 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72  /.    if( envfor
32a70 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ce!=NULL ){.    
32a80 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f    useProxy = ato
32a90 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20  i(envforce)>0;. 
32aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32ab0 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49  useProxy = !(fsI
32ac0 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
32ad0 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  LOCAL);.    }.  
32ae0 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29    if( useProxy )
32af0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c  {.      rc = fil
32b00 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
32b10 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  , fd, pFile, zPa
32b20 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a  th, ctrlFlags);.
32b30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32b50 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
32b60 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28  nsformUnixFile((
32b70 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c  unixFile*)pFile,
32b80 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20   ":auto:");.    
32b90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32bb0 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c     /* Use unixCl
32bc0 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  ose to clean up 
32bd0 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64  the resources ad
32be0 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69  ded in fillInUni
32bf0 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20  xFile .         
32c00 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c   ** and clear al
32c10 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27  l the structure'
32c20 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53  s references.  S
32c30 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20  pecifically, .  
32c40 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65          ** pFile
32c50 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20  ->pMethods will 
32c60 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74  be NULL so sqlit
32c70 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62  e3OsClose will b
32c80 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20  e a no-op .     
32c90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32ca0 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c    unixClose(pFil
32cb0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
32cc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
32cd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
32ce0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
32cf0 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  hed;.    }.  }.#
32d00 65 6e 64 69 66 0a 20 20 0a 20 20 61 73 73 65 72  endif.  .  asser
32d10 74 28 20 7a 50 61 74 68 3d 3d 30 20 7c 7c 20 7a  t( zPath==0 || z
32d20 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20  Path[0]=='/' .  
32d30 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
32d40 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
32d50 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
32d60 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
32d70 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 29  AIN_JOURNAL .  )
32d80 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55  ;.  rc = fillInU
32d90 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
32da0 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
32db0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65  ctrlFlags);..ope
32dc0 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66  n_finished:.  if
32dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32de0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
32df0 72 65 65 28 70 2d 3e 70 50 72 65 61 6c 6c 6f 63  ree(p->pPrealloc
32e00 61 74 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 7d  atedUnused);.  }
32e10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32e20 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
32e30 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
32e40 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
32e50 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
32e60 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
32e70 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
32e80 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
32e90 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
32ea0 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20  nt unixDelete(. 
32eb0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
32ec0 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46  tUsed,     /* VF
32ed0 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
32ee0 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65  s as the xDelete
32ef0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
32f00 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
32f10 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
32f20 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  f file to be del
32f30 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  eted */.  int di
32f40 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  rSync           
32f50 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
32f60 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72  fsync() director
32f70 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
32f80 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
32f90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32fa0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32fb0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32fc0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
32fd0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
32fe0 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
32ff0 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61  if( osUnlink(zPa
33000 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  th)==(-1) ){.   
33010 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45   if( errno==ENOE
33020 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  NT.#if OS_VXWORK
33030 53 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41  S.        || osA
33040 63 63 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d  ccess(zPath,0)!=
33050 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a  0.#endif.    ){.
33060 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
33070 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
33080 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OENT;.    }else{
33090 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
330a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
330b0 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
330c0 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
330d0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
330e0 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66   rc;.  }.#ifndef
330f0 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
33100 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64  DIRSYNC.  if( (d
33110 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29  irSync & 1)!=0 )
33120 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
33130 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
33140 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
33150 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
33160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33170 20 20 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e     if( full_fsyn
33180 63 28 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20  c(fd,0,0) ){.   
33190 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
331a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
331b0 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22  ERR_DIR_FSYNC, "
331c0 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a  fsync", zPath);.
331d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f        }.      ro
331e0 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
331f0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
33200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
33210 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
33220 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20  _CANTOPEN );.   
33230 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
33240 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  K;.    }.  }.#en
33250 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
33260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
33270 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
33280 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
33290 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50  sions of file zP
332a0 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74  ath. The.** test
332b0 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e   performed depen
332c0 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
332d0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
332e0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
332f0 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e  S_EXISTS: Return
33300 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65   1 if the file e
33310 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c  xists.**     SQL
33320 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
33330 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69  RITE: Return 1 i
33340 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
33350 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e  ad and writable.
33360 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
33370 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20  CCESS_READONLY: 
33380 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
33390 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65  file is readable
333a0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
333b0 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
333c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63  tatic int unixAc
333d0 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
333e0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
333f0 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61  /* The VFS conta
33400 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65  ining this xAcce
33410 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  ss method */.  c
33420 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
33430 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f  ,      /* Path o
33440 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78  f the file to ex
33450 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66  amine */.  int f
33460 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
33470 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65     /* What do we
33480 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61   want to learn a
33490 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66  bout the zPath f
334a0 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ile? */.  int *p
334b0 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
334c0 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
334d0 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a  t boolean here *
334e0 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
334f0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
33500 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
33510 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
33520 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
33530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
33540 65 73 4f 75 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  esOut!=0 );..  /
33550 2a 20 54 68 65 20 73 70 65 63 20 73 61 79 73 20  * The spec says 
33560 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
33570 70 6f 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20  possible values 
33580 66 6f 72 20 66 6c 61 67 73 2e 20 20 42 75 74 20  for flags.  But 
33590 6f 6e 6c 79 0a 20 20 2a 2a 20 74 77 6f 20 6f 66  only.  ** two of
335a0 20 74 68 65 6d 20 61 72 65 20 61 63 74 75 61 6c   them are actual
335b0 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 61 73 73  ly used */.  ass
335c0 65 72 74 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49  ert( flags==SQLI
335d0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
335e0 20 7c 7c 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54   || flags==SQLIT
335f0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
33600 54 45 20 29 3b 0a 0a 20 20 69 66 28 20 66 6c 61  TE );..  if( fla
33610 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
33620 53 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20  S_EXISTS ){.    
33630 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
33640 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  .    *pResOut = 
33650 28 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68  (0==osStat(zPath
33660 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73  , &buf) && buf.s
33670 74 5f 73 69 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c  t_size>0);.  }el
33680 73 65 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74  se{.    *pResOut
33690 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74   = osAccess(zPat
336a0 68 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30  h, W_OK|R_OK)==0
336b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
336c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
336d0 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
336e0 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28   mkFullPathname(
336f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
33700 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
33710 20 20 20 2f 2a 20 49 6e 70 75 74 20 70 61 74 68     /* Input path
33720 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
33730 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33740 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
33750 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
33760 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
33770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
33780 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
33790 20 62 75 66 66 65 72 20 7a 4f 75 74 20 2a 2f 0a   buffer zOut */.
337a0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 74 68 20 3d  ){.  int nPath =
337b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
337c0 28 7a 50 61 74 68 29 3b 0a 20 20 69 6e 74 20 69  (zPath);.  int i
337d0 4f 66 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  Off = 0;.  if( z
337e0 50 61 74 68 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a  Path[0]!='/' ){.
337f0 20 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64      if( osGetcwd
33800 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d  (zOut, nOut-2)==
33810 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
33820 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
33830 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
33840 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a  KPT, "getcwd", z
33850 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
33860 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 53   iOff = sqlite3S
33870 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20  trlen30(zOut);. 
33880 20 20 20 7a 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20     zOut[iOff++] 
33890 3d 20 27 2f 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '/';.  }.  if(
338a0 20 28 69 4f 66 66 2b 6e 50 61 74 68 2b 31 29 3e   (iOff+nPath+1)>
338b0 6e 4f 75 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  nOut ){.    /* S
338c0 51 4c 69 74 65 20 61 73 73 75 6d 65 73 20 74 68  QLite assumes th
338d0 61 74 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  at xFullPathname
338e0 28 29 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  () nul-terminate
338f0 73 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  s the output buf
33900 66 65 72 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20  fer.    ** even 
33910 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 61 6e  if it returns an
33920 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
33930 7a 4f 75 74 5b 69 4f 66 66 5d 20 3d 20 27 5c 30  zOut[iOff] = '\0
33940 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ';.    return SQ
33950 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
33960 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
33970 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
33980 69 4f 66 66 2c 20 26 7a 4f 75 74 5b 69 4f 66 66  iOff, &zOut[iOff
33990 5d 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  ], "%s", zPath);
339a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
339b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75  _OK;.}../*.** Tu
339c0 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
339d0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
339e0 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
339f0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
33a00 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
33a10 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
33a20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
33a30 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
33a40 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
33a50 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
33a60 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
33a70 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
33a80 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
33a90 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
33aa0 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
33ab0 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
33ac0 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
33ad0 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
33ae0 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
33af0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
33b00 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
33b10 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
33b20 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
33b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
33b40 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
33b50 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
33b60 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
33b70 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
33b80 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
33b90 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
33ba0 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
33bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
33bc0 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
33bd0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
33be0 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
33bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33c00 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
33c10 2f 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  /.){.#if !define
33c20 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29  d(HAVE_READLINK)
33c30 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 48 41 56   || !defined(HAV
33c40 45 5f 4c 53 54 41 54 29 0a 20 20 72 65 74 75 72  E_LSTAT).  retur
33c50 6e 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65  n mkFullPathname
33c60 28 7a 50 61 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f  (zPath, zOut, nO
33c70 75 74 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ut);.#else.  int
33c80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33c90 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
33ca0 69 6e 74 20 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20  int nLink = 1;  
33cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33cc0 20 4e 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f   Number of symbo
33cd0 6c 69 63 20 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77  lic links follow
33ce0 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63  ed so far */.  c
33cf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d  onst char *zIn =
33d00 20 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20   zPath;      /* 
33d10 49 6e 70 75 74 20 70 61 74 68 20 66 6f 72 20 65  Input path for e
33d20 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
33d30 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
33d40 2a 7a 44 65 6c 20 3d 20 30 3b 0a 0a 20 20 61 73  *zDel = 0;..  as
33d50 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61  sert( pVfs->mxPa
33d60 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48  thname==MAX_PATH
33d70 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44  NAME );.  UNUSED
33d80 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
33d90 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
33da0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
33db0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
33dc0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
33dd0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
33de0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
33df0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
33e00 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
33e10 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
33e20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
33e30 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
33e40 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
33e50 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
33e60 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
33e70 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
33e80 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
33e90 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
33ea0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
33eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
33ec0 52 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20  R );..  do {..  
33ed0 20 20 2f 2a 20 43 61 6c 6c 20 73 74 61 74 28 29    /* Call stat()
33ee0 20 6f 6e 20 70 61 74 68 20 7a 49 6e 2e 20 53 65   on path zIn. Se
33ef0 74 20 62 4c 69 6e 6b 20 74 6f 20 74 72 75 65 20  t bLink to true 
33f00 69 66 20 74 68 65 20 70 61 74 68 20 69 73 20 61  if the path is a
33f10 20 73 79 6d 62 6f 6c 69 63 0a 20 20 20 20 2a 2a   symbolic.    **
33f20 20 6c 69 6e 6b 2c 20 6f 72 20 66 61 6c 73 65 20   link, or false 
33f30 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 20  otherwise.  */. 
33f40 20 20 20 69 6e 74 20 62 4c 69 6e 6b 20 3d 20 30     int bLink = 0
33f50 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
33f60 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20 6f  t buf;.    if( o
33f70 73 4c 73 74 61 74 28 7a 49 6e 2c 20 26 62 75 66  sLstat(zIn, &buf
33f80 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
33f90 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20  ( errno!=ENOENT 
33fa0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
33fb0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
33fc0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
33fd0 54 2c 20 22 6c 73 74 61 74 22 2c 20 7a 49 6e 29  T, "lstat", zIn)
33fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
33ff0 6c 73 65 7b 0a 20 20 20 20 20 20 62 4c 69 6e 6b  lse{.      bLink
34000 20 3d 20 53 5f 49 53 4c 4e 4b 28 62 75 66 2e 73   = S_ISLNK(buf.s
34010 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a  t_mode);.    }..
34020 20 20 20 20 69 66 28 20 62 4c 69 6e 6b 20 29 7b      if( bLink ){
34030 0a 20 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d  .      if( zDel=
34040 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  =0 ){.        zD
34050 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  el = sqlite3_mal
34060 6c 6f 63 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20  loc(nOut);.     
34070 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29     if( zDel==0 )
34080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
34090 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
340a0 65 6c 73 65 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b  else if( ++nLink
340b0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53 59 4d 4c  >SQLITE_MAX_SYML
340c0 49 4e 4b 53 20 29 7b 0a 20 20 20 20 20 20 20 20  INKS ){.        
340d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
340e0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
340f0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
34100 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34110 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 6f         nByte = o
34120 73 52 65 61 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a  sReadlink(zIn, z
34130 44 65 6c 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20  Del, nOut-1);.  
34140 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c        if( nByte<
34150 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
34160 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
34170 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
34180 5f 42 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e 6b  _BKPT, "readlink
34190 22 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20 20  ", zIn);.       
341a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
341b0 20 20 69 66 28 20 7a 44 65 6c 5b 30 5d 21 3d 27    if( zDel[0]!='
341c0 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  /' ){.          
341d0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
341e0 20 20 20 20 20 66 6f 72 28 6e 20 3d 20 73 71 6c       for(n = sql
341f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 6e  ite3Strlen30(zIn
34200 29 3b 20 6e 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d  ); n>0 && zIn[n-
34210 31 5d 21 3d 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20  1]!='/'; n--);. 
34220 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
34230 42 79 74 65 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b  Byte+n+1>nOut ){
34240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
34250 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
34260 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
34270 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34280 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f             memmo
34290 76 65 28 26 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65  ve(&zDel[n], zDe
342a0 6c 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20  l, nByte+1);.   
342b0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
342c0 79 28 7a 44 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b  y(zDel, zIn, n);
342d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
342e0 42 79 74 65 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Byte += n;.     
342f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
34310 44 65 6c 5b 6e 42 79 74 65 5d 20 3d 20 27 5c 30  Del[nByte] = '\0
34320 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
34330 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 49 6e 20     }..      zIn 
34340 3d 20 7a 44 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20  = zDel;.    }.. 
34350 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
34360 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21  QLITE_OK || zIn!
34370 3d 7a 4f 75 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d  =zOut || zIn[0]=
34380 3d 27 2f 27 20 29 3b 0a 20 20 20 20 69 66 28 20  ='/' );.    if( 
34390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
343a0 20 7a 49 6e 21 3d 7a 4f 75 74 20 29 7b 0a 20 20   zIn!=zOut ){.  
343b0 20 20 20 20 72 63 20 3d 20 6d 6b 46 75 6c 6c 50      rc = mkFullP
343c0 61 74 68 6e 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75  athname(zIn, zOu
343d0 74 2c 20 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  t, nOut);.    }.
343e0 20 20 20 20 69 66 28 20 62 4c 69 6e 6b 3d 3d 30      if( bLink==0
343f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 49   ) break;.    zI
34400 6e 20 3d 20 7a 4f 75 74 3b 0a 20 20 7d 77 68 69  n = zOut;.  }whi
34410 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
34420 4b 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  K );..  sqlite3_
34430 66 72 65 65 28 7a 44 65 6c 29 3b 0a 20 20 72 65  free(zDel);.  re
34440 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 20  turn rc;.#endif 
34450 20 20 2f 2a 20 48 41 56 45 5f 52 45 41 44 4c 49    /* HAVE_READLI
34460 4e 4b 20 26 26 20 48 41 56 45 5f 4c 53 54 41 54  NK && HAVE_LSTAT
34470 20 2a 2f 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20   */.}...#ifndef 
34480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
34490 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
344a0 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
344b0 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
344c0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
344d0 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
344e0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
344f0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
34500 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
34510 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
34520 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e  #include <dlfcn.
34530 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  h>.static void *
34540 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74  unixDlOpen(sqlit
34550 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
34560 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
34570 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45  lename){.  UNUSE
34580 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
34590 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  sed);.  return d
345a0 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  lopen(zFilename,
345b0 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44   RTLD_NOW | RTLD
345c0 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  _GLOBAL);.}../*.
345d0 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  ** SQLite calls 
345e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d  this function im
345f0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
34600 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c  a call to unixDl
34610 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78  Sym() or.** unix
34620 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28  DlOpen() fails (
34630 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70  returns a null p
34640 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f  ointer). If a mo
34650 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f  re detailed erro
34660 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20  r.** message is 
34670 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73  available, it is
34680 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66   written to zBuf
34690 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  Out. If no error
346a0 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61   message.** is a
346b0 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75  vailable, zBufOu
346c0 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  t is left unmodi
346d0 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20  fied and SQLite 
346e0 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a  uses a default.*
346f0 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  * error message.
34700 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
34710 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69  unixDlError(sqli
34720 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
34730 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
34740 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f   *zBufOut){.  co
34750 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
34760 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34770 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75  ER(NotUsed);.  u
34780 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
34790 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f  .  zErr = dlerro
347a0 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  r();.  if( zErr 
347b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
347c0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
347d0 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72  ufOut, "%s", zEr
347e0 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  r);.  }.  unixLe
347f0 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74  aveMutex();.}.st
34800 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78  atic void (*unix
34810 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
34820 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
34830 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a   *p, const char*
34840 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
34850 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74  /* .  ** GCC wit
34860 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
34870 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30  rs says that C90
34880 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
34890 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20  a void* to be.  
348a0 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70  ** cast into a p
348b0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
348c0 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74  tion.  And yet t
348d0 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d  he library dlsym
348e0 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  () routine.  ** 
348f0 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20  returns a void* 
34900 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
34910 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
34920 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77  unction.  So how
34930 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20   do we.  ** use 
34940 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65  dlsym() with -pe
34950 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20  dantic-errors?. 
34960 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c   **.  ** Variabl
34970 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66  e x below is def
34980 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69  ined to be a poi
34990 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
349a0 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70  on taking.  ** p
349b0 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20  arameters void* 
349c0 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  and const char* 
349d0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20  and returning a 
349e0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
349f0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69  ction..  ** We i
34a00 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61  nitialize x by a
34a10 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f  ssigning it a po
34a20 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73  inter to the dls
34a30 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  ym() function.. 
34a40 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e   ** (That assign
34a50 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20  ment requires a 
34a60 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20  cast.)  Then we 
34a70 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f  call the functio
34a80 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f  n that.  ** x po
34a90 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a  ints to.  .  **.
34aa0 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61    ** This work-a
34ab0 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c  round is unlikel
34ac0 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63  y to work correc
34ad0 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65  tly on any syste
34ae0 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75  m where.  ** you
34af0 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63   really cannot c
34b00 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ast a function p
34b10 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64  ointer into void
34b20 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e  *.  But then, on
34b30 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
34b40 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69  hand, dlsym() wi
34b50 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73  ll not work on s
34b60 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74  uch a system eit
34b70 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a  her, so we have.
34b80 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20    ** not really 
34b90 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20  lost anything.. 
34ba0 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78   */.  void (*(*x
34bb0 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
34bc0 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55  ar*))(void);.  U
34bd0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34be0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20  NotUsed);.  x = 
34bf0 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a  (void(*(*)(void*
34c00 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
34c10 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65  oid))dlsym;.  re
34c20 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79  turn (*x)(p, zSy
34c30 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  m);.}.static voi
34c40 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71  d unixDlClose(sq
34c50 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
34c60 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  ed, void *pHandl
34c70 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
34c80 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
34c90 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64  .  dlclose(pHand
34ca0 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
34cb0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
34cc0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
34cd0 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
34ce0 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65  define unixDlOpe
34cf0 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  n  0.  #define u
34d00 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  nixDlError 0.  #
34d10 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d  define unixDlSym
34d20 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75     0.  #define u
34d30 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e  nixDlClose 0.#en
34d40 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
34d50 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
34d60 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68  andom data to th
34d70 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
34d80 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
34d90 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d  c int unixRandom
34da0 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
34db0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
34dc0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
34dd0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
34de0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
34df0 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29   assert((size_t)
34e00 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69  nBuf>=(sizeof(ti
34e10 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74  me_t)+sizeof(int
34e20 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61  )));..  /* We ha
34e30 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ve to initialize
34e40 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74   zBuf to prevent
34e50 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72   valgrind from r
34e60 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72  eporting.  ** er
34e70 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72  rors.  The repor
34e80 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c  ts issued by val
34e90 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72  grind are incorr
34ea0 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20  ect - we would. 
34eb0 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20   ** prefer that 
34ec0 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62  the randomness b
34ed0 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d  e increased by m
34ee0 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65  aking use of the
34ef0 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69  .  ** uninitiali
34f00 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75  zed space in zBu
34f10 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64  f - but valgrind
34f20 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20   errors tend to 
34f30 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20  worry.  ** some 
34f40 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74  users.  Rather t
34f50 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65  han argue, it se
34f60 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20  ems easier just 
34f70 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20  to initialize.  
34f80 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72  ** the whole arr
34f90 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76  ay and silence v
34fa0 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66  algrind, even if
34fb0 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73   that means less
34fc0 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a   randomness.  **
34fd0 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73   in the random s
34fe0 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  eed..  **.  ** W
34ff0 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69  hen testing, ini
35000 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d  tializing zBuf[]
35010 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20   to zero is all 
35020 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61  we do.  That mea
35030 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20  ns.  ** that we 
35040 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73  always use the s
35050 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  ame random numbe
35060 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69  r sequence.  Thi
35070 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a  s makes the.  **
35080 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c   tests repeatabl
35090 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  e..  */.  memset
350a0 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
350b0 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  .  randomnessPid
350c0 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 20   = osGetpid(0); 
350d0 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
350e0 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 21  QLITE_TEST) && !
350f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
35100 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a  MIT_RANDOMNESS).
35110 20 20 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c 20    {.    int fd, 
35120 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  got;.    fd = ro
35130 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f  bust_open("/dev/
35140 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e  urandom", O_RDON
35150 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LY, 0);.    if( 
35160 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69  fd<0 ){.      ti
35170 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69  me_t t;.      ti
35180 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65  me(&t);.      me
35190 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73  mcpy(zBuf, &t, s
351a0 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20  izeof(t));.     
351b0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
351c0 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f  zeof(t)], &rando
351d0 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a 65 6f 66  mnessPid, sizeof
351e0 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29  (randomnessPid))
351f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
35200 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66  sizeof(t)+sizeof
35210 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c  (randomnessPid)<
35220 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b  =(size_t)nBuf );
35230 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69  .      nBuf = si
35240 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66  zeof(t) + sizeof
35250 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b  (randomnessPid);
35260 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35270 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65    do{ got = osRe
35280 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
35290 66 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  f); }while( got<
352a0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
352b0 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73  R );.      robus
352c0 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f  t_close(0, fd, _
352d0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
352e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
352f0 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a  urn nBuf;.}.../*
35300 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
35310 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
35320 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
35330 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
35340 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
35350 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
35360 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65   microseconds we
35370 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a   want to sleep..
35380 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
35390 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
353a0 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
353b0 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61  s of sleep actua
353c0 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  lly.** requested
353d0 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
353e0 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
353f0 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20  ystem, a number 
35400 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
35410 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
35420 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
35430 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  rgument, but not
35440 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
35450 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
35460 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c  tatic int unixSl
35470 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
35480 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69  *NotUsed, int mi
35490 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  croseconds){.#if
354a0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
354b0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70  ruct timespec sp
354c0 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d  ;..  sp.tv_sec =
354d0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20   microseconds / 
354e0 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76  1000000;.  sp.tv
354f0 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65  _nsec = (microse
35500 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29  conds % 1000000)
35510 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73   * 1000;.  nanos
35520 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b  leep(&sp, NULL);
35530 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
35540 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
35550 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
35560 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  nds;.#elif defin
35570 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
35580 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
35590 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63   usleep(microsec
355a0 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
355b0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
355c0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
355d0 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65  roseconds;.#else
355e0 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d  .  int seconds =
355f0 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39   (microseconds+9
35600 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a  99999)/1000000;.
35610 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29    sleep(seconds)
35620 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
35630 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
35640 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a   return seconds*
35650 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  1000000;.#endif.
35660 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
35670 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
35680 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
35690 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
356a0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
356b0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
356c0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
356d0 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
356e0 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
356f0 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
35700 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
35710 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
35720 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
35730 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
35740 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
35750 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
35760 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
35770 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
35780 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
35790 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
357a0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
357b0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
357c0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74  ime).  Write int
357d0 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20  o *piNow.** the 
357e0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
357f0 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
35800 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d  n Day number tim
35810 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20  es 86_400_000.  
35820 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  In.** other word
35830 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70  s, write into *p
35840 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20  iNow the number 
35850 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
35860 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e  since the Julian
35870 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f  .** epoch of noo
35880 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f  n in Greenwich o
35890 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34  n November 24, 4
358a0 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e  714 B.C accordin
358b0 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c  g to the.** prol
358c0 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20  eptic Gregorian 
358d0 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
358e0 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
358f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52  rn SQLITE_OK.  R
35900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
35910 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61  OR if the time a
35920 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e  nd date .** cann
35930 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
35940 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
35950 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
35960 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
35970 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  Used, sqlite3_in
35980 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73  t64 *piNow){.  s
35990 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
359a0 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
359b0 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
359c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
359d0 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20  40000;.  int rc 
359e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66  = SQLITE_OK;.#if
359f0 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54   defined(NO_GETT
35a00 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a  OD).  time_t t;.
35a10 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70    time(&t);.  *p
35a20 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33  iNow = ((sqlite3
35a30 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b  _int64)t)*1000 +
35a40 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69   unixEpoch;.#eli
35a50 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
35a60 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
35a70 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74  Now;.  clock_get
35a80 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54  time(CLOCK_REALT
35a90 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a  IME, &sNow);.  *
35aa0 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
35ab0 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
35ac0 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
35ad0 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73  sec + sNow.tv_ns
35ae0 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73  ec/1000000;.#els
35af0 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
35b00 61 6c 20 73 4e 6f 77 3b 0a 20 20 28 76 6f 69 64  al sNow;.  (void
35b10 29 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73  )gettimeofday(&s
35b20 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a 20 43 61 6e  Now, 0);  /* Can
35b30 6e 6f 74 20 66 61 69 6c 20 67 69 76 65 6e 20 76  not fail given v
35b40 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  alid arguments *
35b50 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  /.  *piNow = uni
35b60 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
35b70 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
35b80 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
35b90 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65  tv_usec/1000;.#e
35ba0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
35bb0 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
35bc0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
35bd0 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
35be0 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
35bf0 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
35c00 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
35c10 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
35c20 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
35c30 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
35c40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
35c50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
35c60 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
35c70 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
35c80 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
35c90 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
35ca0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
35cb0 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
35cc0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
35cd0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
35ce0 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
35cf0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
35d00 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
35d10 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
35d20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
35d30 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
35d40 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
35d50 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
35d60 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65  *NotUsed, double
35d70 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69   *prNow){.  sqli
35d80 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b  te3_int64 i = 0;
35d90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55  .  int rc;.  UNU
35da0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
35db0 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75  tUsed);.  rc = u
35dc0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
35dd0 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70  t64(0, &i);.  *p
35de0 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
35df0 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0.0;.  return rc
35e00 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
35e10 6e 65 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  ne unixCurrentTi
35e20 6d 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  me 0.#endif../*.
35e30 2a 2a 20 54 68 65 20 78 47 65 74 4c 61 73 74 45  ** The xGetLastE
35e40 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 69 73  rror() method is
35e50 20 64 65 73 69 67 6e 65 64 20 74 6f 20 72 65 74   designed to ret
35e60 75 72 6e 20 61 20 62 65 74 74 65 72 0a 2a 2a 20  urn a better.** 
35e70 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
35e80 6d 65 73 73 61 67 65 20 77 68 65 6e 20 6f 70 65  message when ope
35e90 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72  rating-system pr
35ea0 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a  oblems come up.*
35eb0 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20  * during SQLite 
35ec0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79  operation.  Only
35ed0 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 65 74   the integer ret
35ee0 75 72 6e 20 63 6f 64 65 20 69 73 20 63 75 72 72  urn code is curr
35ef0 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a  ently.** used..*
35f00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
35f10 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
35f20 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
35f30 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
35f40 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33  , char *NotUsed3
35f50 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
35f60 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
35f70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
35f80 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  ER(NotUsed2);.  
35f90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
35fa0 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65  (NotUsed3);.  re
35fb0 74 75 72 6e 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a  turn errno;.}...
35fc0 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
35fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
35fe0 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  of sqlite3_vfs m
35ff0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
36000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36010 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
36020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36060 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
36070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
360a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
360b0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
360c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
360d0 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69  egin Proxy Locki
360e0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
360f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36100 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ***.**.** Proxy 
36110 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62  locking is a "ub
36120 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f  er-locking-metho
36130 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65  d" in this sense
36140 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a  :  It uses the.*
36150 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  * other locking 
36160 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e  methods on secon
36170 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e  dary lock files.
36180 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20    Proxy locking 
36190 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79  is a.** meta-lay
361a0 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74  er over top of t
361b0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
361c0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64  king implemented
361d0 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20   above.  For.** 
361e0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
361f0 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
36200 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f  mplements of pro
36210 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65  xy locking is de
36220 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20  ferred.** until 
36230 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65  late in the file
36240 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c   (here) after al
36250 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49  l of the other I
36260 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a  /O methods have.
36270 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20  ** been defined 
36280 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72  - so that the pr
36290 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
362a0 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69  methods are avai
362b0 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76  lable.** as serv
362c0 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74  ices to help wit
362d0 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  h the implementa
362e0 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f  tion of proxy lo
362f0 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a  cking..**.****.*
36300 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
36310 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
36320 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62   in SQLite use b
36330 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
36340 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
36350 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64  se file to coord
36360 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63  inate safe, conc
36370 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79  urrent access by
36380 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
36390 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73  s.** and writers
363a0 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e   [http://sqlite.
363b0 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74  org/lockingv3.ht
363c0 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66  ml].  The five f
363d0 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  ile locking.** s
363e0 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c  tates (UNLOCKED,
363f0 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44   PENDING, SHARED
36400 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c  , RESERVED, EXCL
36410 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65  USIVE) are imple
36420 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53  mented.** as POS
36430 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20  IX read & write 
36440 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64  locks over fixed
36450 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e   set of location
36460 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a  s (via fsctl),.*
36470 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42  * on AFP and SMB
36480 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20   only exclusive 
36490 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
364a0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76   are available v
364b0 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68  ia fsctl.** with
364c0 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
364d0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
364e0 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63  LockPB2) to trac
364f0 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61  k the same 5 sta
36500 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c  tes..** To simul
36510 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e  ate a F_RDLCK on
36520 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
36530 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64  e, on AFP a rand
36540 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a  omly selected.**
36550 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
36560 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
36570 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52  taken for a SHAR
36580 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74  ED lock, the ent
36590 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61  ire.** shared ra
365a0 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
365b0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
365c0 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ck):.**.**      
365d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20  PENDING_BYTE    
365e0 20 20 20 20 30 78 34 30 30 30 30 30 30 30 0a 2a      0x40000000.*
365f0 2a 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f  *      RESERVED_
36600 42 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30  BYTE       0x400
36610 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48  00001.**      SH
36620 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20  ARED_RANGE      
36630 20 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20    0x40000002 -> 
36640 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a  0x40000200.**.**
36650 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c   This works well
36660 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
36670 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73  le system, but s
36680 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30  hows a nearly 10
36690 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69  0x.** slowdown i
366a0 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e  n read performan
366b0 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73  ce on AFP becaus
366c0 65 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74  e the AFP client
366d0 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65   disables.** the
366e0 20 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e   read cache when
366f0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
36700 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20  s are present.  
36710 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61  Enabling the rea
36720 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73  d.** cache expos
36730 65 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72  es a cache coher
36740 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61  ency problem tha
36750 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20  t is present on 
36760 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70  all OS X.** supp
36770 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69  orted network fi
36780 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53  le systems.  NFS
36790 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62   and AFP both ob
367a0 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f  serve the.** clo
367b0 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e  se-to-open seman
367c0 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e  tics for ensurin
367d0 67 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  g cache coherenc
367e0 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73  y.** [http://nfs
367f0 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  .sourceforge.net
36800 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68  /#faq_a8], which
36810 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74   does not effect
36820 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73  ively.** address
36830 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
36840 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74  s for concurrent
36850 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
36860 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20   by multiple.** 
36870 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
36880 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77  ers.** [http://w
36890 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51  ww.nabble.com/SQ
368a0 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68  Lite-on-NFS-cach
368b0 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35  e-coherency-td15
368c0 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a  655701.html]..**
368d0 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74  .** To address t
368e0 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61  he performance a
368f0 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e  nd cache coheren
36900 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79  cy issues, proxy
36910 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
36920 20 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79   changes the way
36930 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
36940 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62   is controlled b
36950 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73  y limiting acces
36960 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  s to a.** single
36970 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20   host at a time 
36980 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20  and moving file 
36990 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65  locks off of the
369a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
369b0 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f  * and onto a pro
369c0 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c  xy file on the l
369d0 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
369e0 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69  .  .**.**.** Usi
369f0 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a  ng proxy locks.*
36a00 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
36a10 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73  ---.**.** C APIs
36a20 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  .**.**  sqlite3_
36a30 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
36a40 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
36a50 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52  FCNTL_SET_LOCKPR
36a60 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
36a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a80 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c    <proxy_path> |
36a90 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20   ":auto:");.**  
36aa0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
36ab0 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
36ac0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
36ad0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
36ae0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
36af0 20 20 20 20 20 20 20 20 20 20 26 3c 70 72 6f 78            &<prox
36b00 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a  y_path>);.**.**.
36b10 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a  ** SQL pragmas.*
36b20 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61  *.**  PRAGMA [da
36b30 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f  tabase.]lock_pro
36b40 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70  xy_file=<proxy_p
36b50 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a  ath> | :auto:.**
36b60 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
36b70 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
36b80 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  ile.**.** Specif
36b90 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65  ying ":auto:" me
36ba0 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72  ans that if ther
36bb0 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c  e is a conch fil
36bc0 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e  e with a matchin
36bd0 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20  g.** host ID in 
36be0 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61  it, the proxy pa
36bf0 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20  th in the conch 
36c00 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  file will be use
36c10 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d, otherwise.** 
36c20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73  a proxy path bas
36c30 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73  ed on the user's
36c40 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69   temp dir.** (vi
36c50 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41  a confstr(_CS_DA
36c60 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
36c70 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65  IR,...)) will be
36c80 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
36c90 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69   actual proxy fi
36ca0 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72  le name is gener
36cb0 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61  ated from the na
36cc0 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74  me and path of t
36cd0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
36ce0 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ile.  For exampl
36cf0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46  e:.**.**       F
36d00 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68  or database path
36d10 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e   "/Users/me/foo.
36d20 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68  db" .**       Th
36d30 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  e lock path will
36d40 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71   be "<tmpdir>/sq
36d50 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72  liteplocks/_User
36d60 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f  s_me_foo.db:auto
36d70 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  :").**.** Once a
36d80 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63   lock proxy is c
36d90 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20  onfigured for a 
36da0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
36db0 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a  ion, it can not.
36dc0 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68  ** be removed, h
36dd0 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
36de0 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64   switched to a d
36df0 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70  ifferent proxy p
36e00 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61  ath via.** the a
36e10 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d  bove APIs (assum
36e20 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69  ing the conch fi
36e30 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  le is not being 
36e40 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a  held by another.
36e50 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72  ** connection or
36e60 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a   process). .**.*
36e70 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c  *.** How proxy l
36e80 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20  ocking works.** 
36e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36ea0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72  -------.**.** Pr
36eb0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
36ec0 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c   relies primaril
36ed0 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70  y on two new sup
36ee0 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a  porting files: .
36ef0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68  **.**   *  conch
36f00 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61   file to limit a
36f10 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
36f20 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20  abase file to a 
36f30 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20  single host.**  
36f40 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a      at a time.**
36f50 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66  .**   *  proxy f
36f60 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20  ile to act as a 
36f70 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64  proxy for the ad
36f80 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72  visory locks nor
36f90 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61  mally.**      ta
36fa0 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
36fb0 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ase.**.** The co
36fc0 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73  nch file - to us
36fd0 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20  e a proxy file, 
36fe0 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73  sqlite must firs
36ff0 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63  t "hold the conc
37000 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20  h".** by taking 
37010 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20  an sqlite-style 
37020 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
37030 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72  he conch file, r
37040 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  eading the.** co
37050 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61  ntents and compa
37060 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20  ring the host's 
37070 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28  unique host ID (
37080 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c  see below) and l
37090 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74  ock.** proxy pat
370a0 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61  h against the va
370b0 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
370c0 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63  he conch.  The c
370d0 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20  onch file is.** 
370e0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61  stored in the sa
370f0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
37100 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37110 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e  e and the file n
37120 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72  ame.** is patter
37130 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61  ned after the da
37140 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
37150 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e   as ".<databasen
37160 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20  ame>-conch"..** 
37170 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  If the conch fil
37180 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
37190 2c 20 6f 72 20 69 74 73 20 63 6f 6e 74 65 6e 74  , or its content
371a0 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
371b0 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e  he.** host ID an
371c0 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c  d/or proxy path,
371d0 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
371e0 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61  s escalated to a
371f0 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c  n exclusive.** l
37200 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63  ock and the conc
37210 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20  h file contents 
37220 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20  is updated with 
37230 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
37240 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e  proxy.** path an
37250 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f  d the lock is do
37260 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68  wngraded to a sh
37270 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e  ared lock again.
37280 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a    If the conch.*
37290 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f  * is held by ano
372a0 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69  ther process (wi
372b0 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  th a shared lock
372c0 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ), the exclusive
372d0 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61   lock.** will fa
372e0 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55  il and SQLITE_BU
372f0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
37300 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
37310 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d  file - a single-
37320 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66  byte file used f
37330 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20  or all advisory 
37340 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f  file locks.** no
37350 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20  rmally taken on 
37360 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37370 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  e.   This allows
37380 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e   for safe sharin
37390 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  g.** of the data
373a0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75  base file for mu
373b0 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61  ltiple readers a
373c0 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68  nd writers on th
373d0 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28  e same.** host (
373e0 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65  the conch ensure
373f0 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20  s that they all 
37400 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63  use the same loc
37410 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a  al lock file)..*
37420 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20  *.** Requesting 
37430 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64  the lock proxy d
37440 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74  oes not immediat
37450 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e  ely take the con
37460 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c  ch, it is.** onl
37470 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  y taken when the
37480 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74   first request t
37490 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20  o lock database 
374a0 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a  file is made.  .
374b0 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  ** This matches 
374c0 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66  the semantics of
374d0 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c   the traditional
374e0 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   locking behavio
374f0 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e  r, where.** open
37500 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ing a connection
37510 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
37520 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b  ile does not tak
37530 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a  e a lock on it..
37540 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f  ** The shared lo
37550 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66  ck and an open f
37560 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
37570 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e  re maintained un
37580 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e  til .** the conn
37590 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61  ection to the da
375a0 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64  tabase is closed
375b0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  . .**.** The pro
375c0 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  xy file and the 
375d0 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65  lock file are ne
375e0 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74  ver deleted so t
375f0 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a  hey only need.**
37600 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74   to be created t
37610 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
37620 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a  ey are used..**.
37630 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
37640 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d   options.** ----
37650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37660 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  -.**.**  SQLITE_
37670 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
37680 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  KING.**.**      
37690 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   Database files 
376a0 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d  accessed on non-
376b0 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
376c0 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  ms are.**       
376d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
376e0 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f  nfigured for pro
376f0 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b  xy locking, lock
37700 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20   files are.**   
37710 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61      named automa
37720 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68  tically using th
37730 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a  e same logic as.
37740 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  **       PRAGMA 
37750 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
37760 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a  ":auto:".**    .
37770 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  **  SQLITE_PROXY
37780 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20  _DEBUG.**.**    
37790 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c     Enables the l
377a0 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20  ogging of error 
377b0 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20  messages during 
377c0 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20  host id file.** 
377d0 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20        retrieval 
377e0 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a  and creation.**.
377f0 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  **  LOCKPROXYDIR
37800 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65  .**.**       Ove
37810 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75  rrides the defau
37820 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65  lt directory use
37830 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79  d for lock proxy
37840 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20   files that.**  
37850 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61       are named a
37860 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61  utomatically via
37870 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65   the ":auto:" se
37880 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  tting.**.**  SQL
37890 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
378a0 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
378b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72  .**.**       Per
378c0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20  missions to use 
378d0 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
378e0 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74  directory for st
378f0 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  oring the.**    
37900 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69     lock proxy fi
37910 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77  les, only used w
37920 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  hen LOCKPROXYDIR
37930 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20   is not set..** 
37940 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73     .**    .** As
37950 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65   mentioned above
37960 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  , when compiled 
37970 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46  with SQLITE_PREF
37980 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
37990 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65  ,.** setting the
379a0 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
379b0 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52  iable SQLITE_FOR
379c0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
379d0 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f   to 1 will.** fo
379e0 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  rce proxy lockin
379f0 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  g to be used for
37a00 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
37a10 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64  file opened, and
37a20 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65   0.** will force
37a30 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79   automatic proxy
37a40 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64   locking to be d
37a50 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20  isabled for all 
37a60 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
37a70 73 20 28 65 78 70 6c 69 63 69 74 6c 79 20 63 61  s (explicitly ca
37a80 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45  lling the SQLITE
37a90 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50  _FCNTL_SET_LOCKP
37aa0 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20  ROXYFILE pragma 
37ab0 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c  or.** sqlite_fil
37ac0 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73  e_control API is
37ad0 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79   not affected by
37ae0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
37af0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f  OXY_LOCKING)..*/
37b00 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  ../*.** Proxy lo
37b10 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
37b20 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53  ailable on MacOS
37b30 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  X .*/.#if define
37b40 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
37b50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
37b60 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a  CKING_STYLE../*.
37b70 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b  ** The proxyLock
37b80 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74  ingContext has t
37b90 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65  he path and file
37ba0 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
37bb0 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61  the remote .** a
37bc0 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66  nd local proxy f
37bd0 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79  iles in it.*/.ty
37be0 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f  pedef struct pro
37bf0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
37c00 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
37c10 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f  text;.struct pro
37c20 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
37c30 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63   {.  unixFile *c
37c40 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
37c50 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20    /* Open conch 
37c60 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
37c70 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20  conchFilePath;  
37c80 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
37c90 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
37ca0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
37cb0 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20  lockProxy;      
37cc0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79     /* Open proxy
37cd0 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
37ce0 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50  char *lockProxyP
37cf0 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ath;         /* 
37d00 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78  Name of the prox
37d10 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
37d20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
37d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37d40 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
37d50 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  n file */.  int 
37d60 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20  conchHeld;      
37d70 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66           /* 1 if
37d80 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65   the conch is he
37d90 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65  ld, -1 if lockle
37da0 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 61 69  ss */.  int nFai
37db0 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ls;             
37dc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
37dd0 66 20 63 6f 6e 63 68 20 74 61 6b 69 6e 67 20 66  f conch taking f
37de0 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
37df0 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e  d *oldLockingCon
37e00 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69  text;     /* Ori
37e10 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e  ginal lockingcon
37e20 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20  text to restore 
37e30 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71  on close */.  sq
37e40 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
37e50 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68   const *pOldMeth
37e60 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  od;     /* Origi
37e70 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  nal I/O methods 
37e80 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a  for close */.};.
37e90 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ./* .** The prox
37ea0 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  y lock file path
37eb0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
37ec0 65 20 61 74 20 64 62 50 61 74 68 20 69 73 20 77  e at dbPath is w
37ed0 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74  ritten into lPat
37ee0 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73  h, .** which mus
37ef0 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64  t point to valid
37f00 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  , writable memor
37f10 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  y large enough f
37f20 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67  or a maxLen leng
37f30 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e  th.** file path.
37f40 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
37f50 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
37f60 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50  (const char *dbP
37f70 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68  ath, char *lPath
37f80 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29  , size_t maxLen)
37f90 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69  {.  int len;.  i
37fa0 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20  nt dbLen;.  int 
37fb0 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50  i;..#ifdef LOCKP
37fc0 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20  ROXYDIR.  len = 
37fd0 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c  strlcpy(lPath, L
37fe0 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78  OCKPROXYDIR, max
37ff0 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66  Len);.#else.# if
38000 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55  def _CS_DARWIN_U
38010 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b  SER_TEMP_DIR.  {
38020 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74  .    if( !confst
38030 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
38040 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74  R_TEMP_DIR, lPat
38050 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20  h, maxLen) ){.  
38060 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 47 45      OSTRACE(("GE
38070 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65  TLOCKPATH  faile
38080 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69  d %s errno=%d pi
38090 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
380a0 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65          lPath, e
380b0 72 72 6e 6f 2c 20 6f 73 47 65 74 70 69 64 28 30  rrno, osGetpid(0
380c0 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
380d0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
380e0 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  OCK;.    }.    l
380f0 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
38100 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b  th, "sqliteplock
38110 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20  s", maxLen);    
38120 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65  .  }.# else.  le
38130 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
38140 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c  h, "/tmp/", maxL
38150 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e  en);.# endif.#en
38160 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68  dif..  if( lPath
38170 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a  [len-1]!='/' ){.
38180 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
38190 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61  t(lPath, "/", ma
381a0 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  xLen);.  }.  .  
381b0 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65  /* transform the
381c0 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e   db path to a un
381d0 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20  ique cache name 
381e0 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e  */.  dbLen = (in
381f0 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
38200 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c  ;.  for( i=0; i<
38210 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b  dbLen && (i+len+
38220 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20  7)<(int)maxLen; 
38230 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63  i++){.    char c
38240 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20   = dbPath[i];.  
38250 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d    lPath[i+len] =
38260 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b   (c=='/')?'_':c;
38270 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c  .  }.  lPath[i+l
38280 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c  en]='\0';.  strl
38290 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74  cat(lPath, ":aut
382a0 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20  o:", maxLen);.  
382b0 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
382c0 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
382d0 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
382e0 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 6f 73 47 65  \n", lPath, osGe
382f0 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74  tpid(0)));.  ret
38300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
38310 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65  ../* . ** Create
38320 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  s the lock file 
38330 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20  and any missing 
38340 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c  directories in l
38350 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74  ockPath. */.stat
38360 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
38370 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  teLockPath(const
38380 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29   char *lockPath)
38390 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a  {.  int i, len;.
383a0 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41    char buf[MAXPA
383b0 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74  THLEN];.  int st
383c0 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73  art = 0;.  .  as
383d0 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e  sert(lockPath!=N
383e0 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74  ULL);.  /* try t
383f0 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65  o create all the
38400 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69   intermediate di
38410 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c  rectories */.  l
38420 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
38430 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75  (lockPath);.  bu
38440 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[0] = lockPath[
38450 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20  0];.  for( i=1; 
38460 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20  i<len; i++ ){.  
38470 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69    if( lockPath[i
38480 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d  ] == '/' && (i -
38490 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20   start > 0) ){. 
384a0 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64       /* only mkd
384b0 69 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21  ir if leaf dir !
384c0 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20  = "." or "/" or 
384d0 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66  ".." */.      if
384e0 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28  ( i-start>2 || (
384f0 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75  i-start==1 && bu
38500 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
38510 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
38520 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20   '/') .         
38530 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26  || (i-start==2 &
38540 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
38550 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
38560 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20  +1] != '.') ){. 
38570 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c         buf[i]='\
38580 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0';.        if( 
38590 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c  osMkdir(buf, SQL
385a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
385b0 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
385c0 2